授予create any trigger与授予create trigger的区别

5
在Oracle中,您可以授予像以下这样的系统特权:
GRANT CREATE TRIGGER TO MY_USER;

但是你也可以通过这种方式授予权限。
GRANT CREATE ANY TRIGGER TO MY_USER;

由于系统特权是针对整个系统的,因此上述两个语句之间有什么区别?额外的ANY关键字是否授予了比系统权限更多的内容?如果我添加一个Grant ... ON SCHEMA ...,那么它就不再是系统特权了,对吗?

假设数据库中有来自不同用户的多个模式/对象,没有这些特权,用户就无法访问。

编辑:

SELECT *
FROM DBA_SYS_PRIVS
WHERE grantee = 'MY_USER';

返回
GRANTEE      PRIVILEGE                              
------------ -------------
MY_USER      CREATE ANY TRIGGER
MY_USER      CREATE TRIGGER

(我省略了列ADMIN_OPTIONCOMMON

当使用MY_USER、MY_USER2或任何其他用户查询时,结果相同。我在这里看不到与模式的连接。也有可能只拥有CREATE ANY TRIGGER权限。


GRANT CREATE TRIGGER TO MY_USER; 允许MY_USER在自己的模式中创建TRIGGER。 GRANT CREATE ANY TRIGGER TO MY_USER; 允许MY_USER在其他模式中创建TRIGGER。 - ArtBajji
2个回答

5
在大多数情况下,触发器所有者也是触发器所基于的表(或视图)的所有者。在这些情况下,使用CREATE TRIGGER的表所有者可以在自己的表上创建触发器。
使用CREATE ANY TRIGGER允许用户在任何表上创建任何用户拥有的触发器。这是一个很大的安全漏洞,因为他们可以在自己拥有或可以插入的表上创建由特权用户拥有的触发器。由于他们可以插入该表中,他们可以强制触发器执行,并以触发器所有者的权限执行触发器。其效果是,具有CREATE ANY TRIGGER特权的用户可以创建和执行特权用户的代码(类似于具有CREATE ANY PROCEDURE加EXECUTE ANY PROCEDURE)。
尽可能地限制人员数量并进行适当的审计。

但是,如果MY_USER没有系统特权CREATE TRIGGER,则仍然可以在自己的表上创建触发器。那么系统特权CREATE TRIGGER有什么用呢?(SELECT * FROM DBA_SYS_PRIVS列出了没有授予创建触发器的授权,但有其他授权,如创建视图) - Chrᴉz remembers Monica
3
文档称“要在您的模式上创建一个触发器,可以是在您的模式上的表或者在您的模式上,您必须拥有CREATE TRIGGER系统特权。”请注意,这可能是通过角色获得的,因此请检查它是否显示在select * from session_privs中。https://docs.oracle.com/database/121/LNPLS/create_trigger.htm#LNPLS01374 - Gary Myers
那就解释了。我以为角色授权会简单地被添加到其他视图中。又学到了新东西。谢谢! - Chrᴉz remembers Monica

2
第一个语句授予在MY_USER模式下创建触发器的权利。所有者始终为MY_USER。
第二个语句授予在任何模式下创建触发器的权利。触发器的所有者可以是任何用户。
通常不希望使用最后一个选项,因为它会使用户MY_USERS有可能破坏数据模型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接