给定的数据库包含masterdata(MD)Schema和特定于应用程序的Schema(APP)。在APP Schema中,我们有一个视图,它提供了来自方案中一个表的应用程序数据以及来自MD Schema的数据。
示例:考虑一个地址簿应用程序,它包含一个地址表,但城市和邮政编码是从另一个集中维护的主数据表中加入的。
CREATE VIEW view_adress AS
SELECT app.ID, app.Street, app.ZIP, zip.CITYNAME
FROM APP.adress app
LEFT OUTER JOIN MD.zipcodes zip
ON app.ZIP = zip.ZIP
这是非常简化的。我使用的实际视图要复杂得多,因此我实现了一个INSTEAD OF INSERT,UPDATE Trigger,将视图上的INSERT映射到我的APP Schema中的正确基表。
应用程序用户(角色)在此APP模式中的所有表上被授予SELECT,INSERT,UPDATE,DELETE。它们还在主数据模式中的zipcode表上被授予SELECT。
当我在该视图上插入时,我得到“ORA-01720:授权选项不存在”...我不知道此错误的确切原因,但可以假设INSTEAD-OF触发器永远不要在邮政编码表上插入,只能在地址表上。
据我所知,在zipcode表上授予应用程序用户INSERT权限可能会解决这个问题,但我感到不舒服的是在桌面上向用户授予INSERT,他们永远不应该以任何方式编辑它们,因为这些只是查找。
还有另一种,可能是“正确的方法”来解决这个问题吗?
答案 0 :(得分:2)
"权限错误不足"你是说这个吗?
ORA-01720:' MD.ZIPCODES'
不存在授予选项*原因:正在对视图执行授权或正在替换视图 并且基础对象没有授予选项。
*操作:获取视图的所有基础对象的授予选项或 撤销视图中的现有授权。
如果是这样,解决方案是您需要向拥有视图的架构授予相关权限 - 不到使用该视图的角色:
grant insert on md.zipcodes to app with grant option;
确实,您仍然必须授予逻辑上不需要的权限,但您不会向用户授予权限,只授予app
架构。