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

时间:2018-03-13 13:03:19

标签: oracle oracle12c grant

在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 - 特权。

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

第一个语句授予在MY_USER模式中创建触发器的权限。所有者将始终通过MY_USER。

第二个语句授予在任何模式中创建触发器的权限。触发器的所有者可以是任何用户。

通常不需要最后一个选项,因为它为用户MY_USERS提供了破坏数据模型的可能性。