执行触发操作的特权

如果您不是此触发器的所有者,但是触发器所有者的访问特权包含 WITH GRANT OPTION ,则除了您子句对每个 SQL 语句的特权外还继承所有者(具有授权选项)的特权。如果触发器操作是 UDR ,则您需要 UDR 上的 Execute 特权,或者触发器所有者必须具有授权选项的 Execute 特权。

重要: 作为安全预防措施,用户仅保留角色(但是并不是单独授予用户或作为 PUBLIC 组成员的角色)的自由访问权不能通过触发操作或通过触发例程提供对当前数据库以外的表的访问。
然而,当执行 UDR 时,您不继承触发器所有者的特权;相反,您接收随 UDR 授予的特权,它取决于此例程是 DBA 特权例程还是所有者特权 UDR:
  1. DBA 特权 UDR 的特权

    当使用 DBA 关键字注册 UDR ,且您被授予了 UDR 上的 Execute 特权时,数据库服务器自动为您授予临时 DBA 特权,这些特权仅当您执行 UDR 时才可用。

  2. 所有者特权 UDR 的特权

    如果创建没有 DBA 关键字的 UDR,但是 UDR 的所有者对于基础数据库对象上的必要特权具有 WITH GRANT OPTION 关键字,当您被授予 UDR 的 Execute 特权时,您会继承这些特权。

对于没有 DBA 特权的 UDR ,UDR 引用的所有非限定数据库对象都被 UDR 所有者的名称隐式限定。

如果 UDR 所有者没有 WITH GRANT OPTION 特权,则当 UDR 执行您在基础数据库对象上具有原始特权。有关 SPL 例程上的更多信息,请参阅 GBase 8s SQL 教程指南

不具有 INSTEAD OF 触发器的视图只有过Select (具有授权选项)特权。但是,如果在它上面创建 INSTEAD OF 触发器,则在触发器创建期间该视图具有 Insert (具有授权选项)特权。视图所有者现在只能为其它人授予 Select 和 Insert 特权。这对触发操作是独立的。不必获取过程或函数上的 Execute(具有授权选项)特权。缺省情况限,在操作列表中的每个 UDR 上授予 Execute(具有授权选项)特权。

您可以使用具有触发器的角色。与角色相关的语句(CREATE ROLE 、DROP ROLE 、GRANT 、REVOKE 和 SET ROLE)和 SET SESSION AUTHORIZATION 语句在触发操作调用的 UDR 中有效。当执行触发器时,用户通过启用角色或通过 SET SESSION AUTHORIZATION 语句已经获取的特权不会被放弃。

在复杂的视图(具有来自多个表的列的视图)上,只有所有者或 DBA 可以创建 INSTEAD OF 触发器。当创建触发器时,所有者接收 Select 特权。只有获取必需的 Execute 特权后,视图所有者才能为其它用户授予特权。当删除复杂视图上的触发器时,所有这些特权都被撤销。