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

Grant create any trigger vs grant create trigger

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

GRANT CREATE TRIGGER TO MY_USER;

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

GRANT CREATE ANY TRIGGER TO MY_USER;

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

假设数据库中有来自不同用户的多个 schemas/objects,没有这些权限就无法访问。

编辑:

SELECT *
FROM DBA_SYS_PRIVS
WHERE grantee = 'MY_USER';

returns

GRANTEE      PRIVILEGE                              
------------ -------------
MY_USER      CREATE ANY TRIGGER
MY_USER      CREATE TRIGGER

(我省略了 ADMIN_OPTIONCOMMON 列)

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

第一个语句授予在 MY_USER 模式中创建触发器的权利。所有者将永远由 MY_USER.

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

通常不需要最后一个选项,因为它使用户 MY_USERS 有可能破坏数据模型。

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

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

将人数限制在尽可能少的范围内并进行适当的审核。