加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

oracle – 列级特权与遗留应用程序

发布时间:2021-01-17 10:42:54 所属栏目:站长百科 来源:网络整理
导读:我收到了实现列级权限的哀求,譬喻: GRANT UPDATE("column1") ON "TABLE" TO ROLE; 但我发明客户端应用措施(在Delphi ODAC中)老是发出SQL更新,如: update TABLE set column1=:column1,column2=:column2,column3=:column3,...etcwhere id_c=:id_c; 是什么导

我收到了实现列级权限的哀求,譬喻:

GRANT UPDATE("column1") ON "TABLE" TO ROLE;

但我发明客户端应用措施(在Delphi ODAC中)老是发出SQL更新,如:

update TABLE set column1=:column1,column2=:column2,column3=:column3,...etc
where id_c=:id_c;

是什么导致Oracle老是抛出ORA-01031:权限不敷,纵然只变动了column1.显而易见的办理方案是变动客户端应用措施,以便它仅行使变动的列发出SQL更新,但它看起来像许多编码.

尚有更优雅的办理方案吗?

编辑:我忘了提到我的Delphi源中有相等多的硬编码插入/更新查询.在这种环境下,ODAC无能为力.

办理要领

您可以在该视图上建设视图和INSTEAD OF UPDATE触发器:

CREATE VIEW myview ON mytable
AS
SELECT  *
FROM    table

CREATE TRIGGER trg_myview_iu
INSTEAD OF UPDATE
ON myview
FOR EACH ROW
BEGIN
        UPDATE  mytable
        SET     column1 = :NEW.column1
        WHERE   id_c = :NEW.id_c;
END;

假如只想在其值未变动时处理赏罚列,则必需编写几个UPDATE语句:

CREATE TRIGGER trg_myview_iu
INSTEAD OF UPDATE
ON myview
FOR EACH ROW
BEGIN
        IF :NEW.column1 <> :OLD.column1 THEN -- add `NULL` processing options if necessary
                UPDATE  mytable
                SET     column1 = :NEW.column1
                WHERE   id_c = :NEW.id_c;
        END IF;
        IF :NEW.column2 <> :OLD.column2 THEN
                UPDATE  mytable
                SET     column2 = :NEW.column2
                WHERE   id_c = :NEW.id_c;
        END IF;
        …
END;

但这远非服从.

在Oracle中,纵然列的现实值没有改变,UPDATE也会执行.这意味着该行被锁定,触生气灾等.

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读