CREATE PERMISSION 语句
CREATE PERMISSION 语句在当前服务器上创建行许可权。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是仅当隐式或显式指定 DYNAMICRULES 运行行为时才能动态准备可执行语句。
权限
该语句的授权标识所拥有的特权必须包括 SECADM 权限。 SECADM 权限可以在任何模式中创建行许可权。 不需要其他特权来引用许可权定义中的其他对象。 例如,不需要 SELECT 特权从表中检索,也不需要 EXECUTE 特权来调用用户定义的函数。
语法
描述
- OR REPLACE
- 指定在当前服务器上存在行许可权时替换该行许可权的定义。 在目录中替换新定义之前,将有效地删除现有定义。
- permission-name
- 命名行许可权。 名称 (包括隐式或显式限定符) 不得标识当前服务器上已存在的行许可权或列掩码 (SQLSTATE 42710)。
- table-name
- 标识对其创建行许可权的表。 该名称必须标识当前服务器上存在的表 (SQLSTATE 42704)。 它不得标识昵称,创建或声明的临时表,视图,同义词,类型表,外部表 (SQLSTATE 42858) 或别名 (SQLSTATE 42809)。 它不能标识影子表或影子表的基本表 (SQLSTATE 428HZ)。 在 Db2® V 10.5 修订包 5之前的发行版中, 表名 不得标识目录表 (SQLSTATE 42832)。
- 关联名
- 指定可在 search-condition 中用于指定表的相关名称。
- FOR ROWS WHERE
- 指示已创建行许可权。 行许可权指定可访问表行的搜索条件。
- search-condition
- 指定对于表的行可以为 true 或 false 的条件。 这遵循子查询的 WHERE 子句中的搜索条件所使用的相同规则。 此外,搜索条件不得引用下列任何对象或元素 (SQLSTATE 428HB):
- 已创建全局临时表或已声明全局临时表。
- 影子表。
- 外部表。
- 昵称。
- 表函数。
- 方法。
- 参数标记 (SQLSTATE 42601)。
- 定义为不安全的用户定义函数。
- 非确定性或具有外部操作的函数或表达式 (例如行更改表达式,序列表达式)
- XMLQUERY 标量函数。
- XMLEXISTS 谓词。
- OLAP 规范。
- SELECT 子句中的
*或name.*。 - 伪列。
- 不指定 SELECT 子句的聚集函数。
- 在其定义中包含任何先前列出的限制的视图。
注释
以获取详细信息。
- ENFORCED FOR ALL ACCESS
- 指定行许可权应用于表的所有引用。 如果对该表激活了行访问控制,那么在数据操作语句中引用该表时,数据库管理器将隐式应用行许可权来控制该表的访问。 如果表的引用用于诸如 SELECT 之类的访存操作,那么行许可权的应用程序将确定请求访存操作的用户可以检索的行集。 如果表的引用用于数据更改操作 (例如 INSERT) ,那么行许可权的应用程序将确定请求数据更改操作的用户是否可以插入或更新要更改的所有行。
- ENABLE 或 DISABLE
- 指定将启用或禁用行许可权。 缺省值为 DISABLE。
- DISABLE
- 指定将禁用行许可权。 如果当前未对表激活行访问控制,那么当对表激活行访问控制时,行许可权将保持无效。
- ENABLE
- 指定要对行访问控制启用行许可权。 如果当前未对表激活行访问控制,那么当对表激活行访问控制时,行许可权将生效。 如果当前对表激活了行访问控制,那么行许可权将立即生效,并且引用该表的所有程序包和动态高速缓存的语句都将失效。
注意
对表激活行访问控制之前创建的行许可权: CREATE PERMISSION 语句是一个独立语句,可用于在对表激活行访问控制之前创建行许可权。 唯一的要求是在创建许可权之前表和列都存在。 可以为一个表创建多个行许可权。
行许可权的定义存储在数据库目录中。 将记录对要为其创建许可权的表的依赖关系以及对定义中引用的其他对象的依赖关系。 未使程序包或动态高速缓存的语句失效。 可以将行许可权创建为已启用或已禁用行访问控制。 在使用带有 ACTIVATE ROW ACCESS CONTROL 子句的 ALTER TABLE 语句来激活表的行访问控制之前,已启用的行许可权不会生效。 即使对表激活了行访问控制,禁用的行许可权仍然无效。 ALTER PERMISSION 语句可用于在 ENABLE 和 DISABLE 之间进行变更。
对表激活行访问控制后,当在数据操作语句中引用该表时,数据库管理器将隐式应用为该表定义的所有已启用行许可权来控制对该表的访问。
建议的顺序是在对表激活行访问控制之前创建行许可权,以避免引用该表的程序包和动态高速缓存语句的多个失效。
- 对表激活行访问控制后创建的行许可权: 已启用的行许可权在落实后立即生效。 所有引用该表的程序包和动态高速缓存语句都将失效。 此后,在数据操作语句中引用表时,所有已启用的行许可权都将隐式应用于该语句。 即使对表激活了行访问控制,任何已禁用的行许可权仍然无效。
- 在行许可权定义中引用行或列访问控制强制实施的表时没有级联效应: 行许可权定义可能引用当前由行或列访问控制强制实施的表和列。 在数据操作语句中引用要为其创建行许可权的表时,将忽略来自这些表的访问控制。
- 考虑数据库限制: 如果数据操作语句已接近语句中的某些数据库限制,那么创建的已启用行许可权和已启用列掩码越多,它们可能影响某些限制的可能性就越大。 这是因为在数据操作语句中引用表时,已启用的列掩码和已启用的行许可权定义将隐式合并到语句中。 请参阅
SQL 和 XML 限制
以获取语句的限制。 - 已启用但处于无效状态的许可权: 如果对行访问控制启用了许可权,但其状态设置为无效,那么将阻止对定义了许可权的表的访问,直到解决此情况为止 (SQLSTATE 560D0)。
示例
银行的柜员只能从他们所在的分行访问客户。 所有卖方都是角色为 TELLER的成员。 允许客户服务代表访问银行的所有客户。 所有客户服务代表都是角色 CSR中的成员。 具有 SECADM 权限的用户将相应地为银行中的每组人员创建行许可权。 对表 CUSTOMER激活行级别访问控制后,在 SELECT 语句中,两个行许可权的搜索条件将合并到语句中,并与逻辑 OR 运算符组合以控制每个组可访问的行集。
CREATE PERMISSION TELLER_ROW_ACCESS ON CUSTOMER
FOR ROWS WHERE VERIFY_ROLE_FOR_USER
(SESSION_USER,'TELLER') = 1 AND
BRANCH = (SELECT HOME_BRANCH FROM INTERNAL_INFO
WHERE EMP_ID = SESSION_USER)
ENFORCED FOR ALL ACCESS
ENABLE;
CREATE PERMISSION CSR_ROW_ACCESS ON CUSTOMER
FOR ROWS WHERE VERIFY_ROLE_FOR_USER(SESSION_USER,'CSR') = 1
ENFORCED FOR ALL ACCESS
ENABLE;