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

oracle – 列级特权与遗留应用程序,第1张

概述我收到了实现列级权限的请求,例如: GRANT UPDATE("column1") ON "TABLE" TO ROLE; 但我发现客户端应用程序(在Delphi ODAC中)总是发出SQL更新,如: update TABLE set column1=:column1,column2=:column2,column3=:column3,...etcwhere id_c=:id_c; 是什么导致O 我收到了实现列级权限的请求,例如:

GRANT UPDATE("column1") ON "table" TO RolE;

但我发现客户端应用程序(在Delphi ODAC中)总是发出sql更新,如:

update table set column1=:column1,column2=:column2,column3=:column3,...etcwhere ID_c=:ID_c;

是什么导致Oracle总是抛出ORA-01031:权限不足,即使只更改了column1.显而易见的解决方案是更改客户端应用程序,以便它仅使用更改的列发出sql更新,但它看起来像很多编码.

还有更优雅的解决方案吗?

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

解决方法 您可以在该视图上创建视图和INSTEAD OF UPDATE触发器:

CREATE VIEW myvIEw ON mytableASSELECT  *FROM    tableCREATE TRIGGER trg_myvIEw_iuINSTEAD OF UPDATEON myvIEwFOR EACH ROWBEGIN        UPDATE  mytable        SET     column1 = :NEW.column1        WHERE   ID_c = :NEW.ID_c;END;

如果只想在其值未更改时处理列,则必须编写几个UPDATE语句:

CREATE TRIGGER trg_myvIEw_iuINSTEAD OF UPDATEON myvIEwFOR EACH ROWBEGIN        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也会执行.这意味着该行被锁定,触发火灾等.

总结

以上是内存溢出为你收集整理的oracle – 列级特权遗留应用程序全部内容,希望文章能够帮你解决oracle – 列级特权与遗留应用程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存