授予创建任何触发器与授予创建触发器

Chr*_*rᴉz 5 oracle oracle12c sql-grant

在 Oracle 中,您可以授予系统权限,例如

GRANT CREATE TRIGGER TO MY_USER;
Run Code Online (Sandbox Code Playgroud)

但您也可以通过这种方式授予权限

GRANT CREATE ANY TRIGGER TO MY_USER;
Run Code Online (Sandbox Code Playgroud)

由于系统权限是系统范围的,因此上面两条语句之间的区别在哪里。除了系统之外,附加的ANY- 关键字是否还授予其他任何内容?如果我添加一个Grant ... ON SCHEMA ...它就不再有系统权限了,是吗?

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

编辑

SELECT *
FROM DBA_SYS_PRIVS
WHERE grantee = 'MY_USER';
Run Code Online (Sandbox Code Playgroud)

回报

GRANTEE      PRIVILEGE                              
------------ -------------
MY_USER      CREATE ANY TRIGGER
MY_USER      CREATE TRIGGER
Run Code Online (Sandbox Code Playgroud)

(我省略了列ADMIN_OPTIONCOMMON

使用 MY_USER、MY_USER2 或任何其他用户查询时,结果是相同的。我在这里看不到与模式的联系。并且也可以只拥有CREATE ANY TRIGGER- 权限。

Gar*_*ers 5

在大多数情况下,触发器所有者也是触发器所基于的表(或视图)的所有者。在这些情况下,表所有者可以使用 CREATE TRIGGER 在自己的表上创建触发器。

CREATE ANY TRIGGER 允许用户在任何表上创建任何用户拥有的触发器。这是一个很大的安全漏洞,因为他们可以在他们拥有或可以插入的表上创建特权用户拥有的触发器。因为他们可以插入到该表中,所以他们可以强制执行触发器,并且触发器以触发器所有者的权限执行。其效果是,具有 CREATE ANY TRIGGER 权限的用户可以作为特权用户创建和执行代码(类似于具有 CREATE ANY PROCEDURE 和 EXECUTE ANY PROCEDURE)。

限制尽可能少的人员并进行适当的审核。

  • 文档说“要在架构中的表或架构 (SCHEMA) 上创建触发器,您必须具有 CREATE TRIGGER 系统权限。” 请记住,这可能是通过角色实现的,因此检查它是否显示在 select * from session_privs https://docs.oracle.com/database/121/LNPLS/create_trigger.htm#LNPLS01374 (3认同)