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 – 列级特权与遗留应用程序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)