对参与可更新视图的表进行 GRANT INSERT

GRANT INSERT on tables participating in an updateable view

给定的数据库包含一个主数据 (MD) 架构和一个特定于应用程序的架构 (APP)。在 APP Schema 中,我们有一个视图,它提供来自 scheme 中一个 table 的应用程序数据与来自 MD Schema 的数据。

示例:考虑一个地址簿应用程序,它包含一个地址 table,但是城市和邮政编码是从另一个集中维护的架构中的主数据 table 加入的。

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 触发器以将视图上的 INSERT 映射到我的 APP Schema 中的正确基础 table。

应用程序用户(角色)被授予 SELECT,INSERT,UPDATE,DELETE 在此 APP 架构内的所有 tables 上。他们还在主数据架构中的邮政编码 table 上被授予 SELECT。

当我在那个视图上插入时,我得到一个“ORA-01720:Grant Option Does Not Exist”...我不知道这个错误的确切原因,但可以假设 INSTEAD- OF 触发器从不在邮政编码 Table 上插入,仅在地址 table.

上插入

我明白,授予应用程序用户对邮政编码 table 的 INSERT 权限可能会解决这个问题,但我觉得 table 向用户授予对 table 的 INSERT 权限不太舒服他们永远不应该以任何方式编辑,因为这些只是查找。

是否有另一种可能是“正确的方法”来解决这个问题?

"insufficient permissions error"是这个意思吗?

ORA-01720: grant option does not exist for 'MD.ZIPCODES'

*Cause: A grant was being performed on a view or a view was being replaced and the grant option was not present for an underlying object.

*Action: Obtain the grant option on all underlying objects of the view or revoke existing grants on the view.

如果是这样,解决方案是您需要将相关权限授予拥有该视图的模式 - 而非 授予使用该视图的角色:

grant insert on md.zipcodes to app with grant option;

确实,您仍然必须授予逻辑上不需要的权限,但您没有将其授予用户,仅授予 app 架构。