CREATE PERMISSION 语句

CREATE PERMISSION语句在当前服务器上创建一行权限,用于行访问控制。

调用 CREATE PERMISSION

此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL

授权 CREATE PERMISSION

以下定义的特权集必须包含以下权限:

  • SECADM 权限

SECADM权限可以在任何模式中创建行权限。 在权限定义中引用其他对象无需其他特权。 例如,从表中检索数据不需要SELECT权限,调用用户定义的函数也不需要EXECUTE权限。

权限设置:

如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果语句是动态准备的,则权限集是指由进程的 SQL 授权 ID 持有的权限集。 但是,如果它是在使用ROLE AS OBJECT OWNER AND QUALIFIER子句定义的可信环境中运行,则权限集是指角色实际拥有的一组权限。

语法 CREATE PERMISSION

阅读语法图跳过可视化语法图CREATE PERMISSION权限名称ON table-nameAS相关名称FOR ROWS WHERE搜索条件 ENFORCED FOR ALL ACCESSDISABLEENABLE

描述 CREATE PERMISSION

权限名称
指定行访问控制的行权限。 名称(包括隐式或显式限定符)不得标识当前服务器上已存在的行权限或列掩码
ON 表名
标识创建行权限的表。 名称必须标识当前服务器上存在的表。 不得识别以下任何物体:
  • 辅助表格
  • 已创建的临时表或者已声明的临时表
  • 一个视图
  • 目录表
  • 别名
  • 同义词
  • 在物化查询表的定义中直接或间接引用的物化查询表
  • 为 XML 列隐式创建的表
  • 包含一个句号的表格
  • 历史表
  • 只含加速器的表格
  • 启用存档功能的表格
  • 档案表
  • 表格中有一列安全标签。
相关名称
可在搜索条件中使用,以指定表格。 关于相关名称的解释,请参阅相关名称
FOR ROWS WHERE
表示已创建行权限。 行许可指定了访问表中的行的搜索条件。
search-condition
指定表中某行可能为真、假或未知的条件。 搜索条件遵循子查询的WHERE子句中搜索条件所使用的规则。 此外,搜索条件不得包含以下任何对象:
  • 一个遥远的物体
  • 正在定义行权限的表格
  • 带有安全标签一栏的表格
  • 已创建的全局临时表或已声明的全局临时表
  • 辅助表格
  • 为 XML 列隐式创建的表
  • 衍生自收藏的桌子(UNNEST)
  • 表函数
  • 宿主变量、SQL变量、SQL参数或触发器转换变量
  • 用户自定义函数,定义为不安全
  • 非确定性函数或具有外部作用或使用MODIFIES SQL DATA选项定义的函数
  • 参数标记
  • 使用 FIELDPROC 定义的列
  • 基于LOB的LOB列或单独类型列
  • XML 列
  • XMLEXISTS 谓词
  • OLAP 规范
  • ROW CHANGE 表达式
  • 顺序引用
  • SELECT子句中的列表符号 *name.*
  • 包含时间规格的表格参考
  • 在定义中包含上述任何限制的观点

更改开始表格的编码方案用于评估搜索条件。 除了带有Unicode列的EBCDIC表之外, 搜索条件中不得引用需要多种编码方案评估的表和语言元素。 有关这些语言元素的字符串编码方案和 CCSID 规则, 请参阅相关文档。更改结束

如果搜索条件引用了激活了行或列访问控制的表,则这些表的访问控制不会级联。

ENFORCED FOR ALL ACCESS
指定行权限适用于表的所有引用。 如果表的行访问控制被激活,当数据操作语句引用该表时, Db2 将隐式应用行权限来控制表的访问。 如果表的引用是用于执行 SELECT 等获取操作,则行权限的应用将决定请求获取操作的用户可以检索哪一组行。 如果表的引用用于数据更改操作(如INSERT),则行权限的应用将决定请求数据更改操作的用户是否可以插入或更新所有要更改的行。
DISABLE 或者 ENABLE
指定启用或禁用行访问控制中的行权限。
DISABLE
指定在行访问控制中禁用行权限。 无论是否激活表的行访问控制,行权限都将无效。

DISABLE 是默认值。

ENABLE
指定启用行访问控制中的行权限。 如果当前未为表启用行访问控制,则当为表启用行访问控制时,行权限将生效。 如果当前已为表激活行访问控制,则行权限立即生效,所有引用该表的包和动态缓存语句都将失效。 更多信息,请参阅 “导致套餐失效的变更 ”。

备注 CREATE PERMISSION

如何应用行权限以及它们如何影响某些语句:
请参阅带有激活行访问控制子句的ALTER TABLE语句,了解如何激活行访问控制以及如何应用行权限。 请参阅子选择描述,了解行权限的应用如何影响获取操作。 请参阅数据更改语句,了解行权限的应用如何影响数据更改操作。
在表启用行访问控制之前创建的行权限:
CREATE PERMISSION语句是一个独立语句,可用于在激活表行访问控制之前创建行权限。 唯一的要求是,在创建权限之前,表和列必须已经存在。 可以为表创建多行权限。

行权限的定义保存在 Db2 目录中。 记录对正在创建权限的表的依赖关系,以及对定义中引用的其他对象的依赖关系。 任何包或动态缓存语句都不会失效。 行权限可以设置为启用或禁用,以控制行访问。 启用行权限只有在使用带有激活行访问控制子句的ALTER TABLE语句激活表的行访问控制后才会生效。 即使为表格启用了行访问控制,禁用行的权限仍然无效。 ALTER PERMISSION语句可用于在ENABLE和DISABLE之间切换。

在激活了表的行访问控制后,当数据操作语句引用该表时, Db2 将隐式应用为该表定义的所有已启用行权限,以控制对该表的访问。

提示 :在激活表的行访问控制之前创建行权限,以避免引用该表的包和动态缓存语句多次失效。
在激活表行访问控制后创建的行权限:
启用行权限后,该权限立即生效。 引用该表的所有包和动态缓存语句均无效。 此后,当数据操作语句引用该表时,所有启用的行权限都将隐式应用于该语句。 即使为表启用了行访问控制,任何无效的行许可仍然无效。
在行权限定义中引用了强制行或列访问控制表时,不会出现级联效应:
行权限定义可以引用当前通过行或列访问控制强制执行的表和列。 当数据操作语句中引用了正在创建行权限的表时,这些表的访问控制将被忽略。
多个列掩码和行权限共享相同的环境变量
可以为表创建多列掩码和行权限。 他们必须使用相同的环境变量集。 当为表创建第一列掩码或第一行权限时,环境变量集即被确定。

目录表 SYSENVIRONMENT 包含环境变量列表。 下表显示了在多列掩码和行权限中,哪些环境变量必须相同。

表 1. 环境变量 SYSIBM.SYSENVIRONMENT
环境变量以SYSENVIRONMENT列的形式显示 描述 静态创建语句 动态 CREATE 语句 多列掩码和行权限之间必须相同吗?
ENVID 环境的内部标识符 分配者 Db2 分配者 Db2
CURRENT_SCHEMA 限定词,用于限定不具有限定性的对象,如桌子、景观等。 等等 程序包所有者 当前模式特殊寄存器的值
路径 用于限定非限定对象(如用户定义的函数和用户定义的数据类型的CAST函数)的方案路径。 路径绑定选项 CURRENT_PATH特殊寄存器的值
应用程序_
编码_
CCSID
应用程序环境的CCSID 编码绑定选项 当前应用编码方案 特殊寄存器
原件_
编码_
CCSID
声明文本字符串的原始CCSID CCSID(n)预编译选项或DSNTIPF安装面板上的EBCDIC CCSID CCSID基于DSNTIPF安装面板上的DEF编码方案
小数点 小数点指示器 逗号或句号预编译选项或小数点位于DSNTIPF安装面板上 小数点位于DSNTIPF安装面板上
最小分割比例 最小分度 最小分度值, DSNTIP4 安装面板 最小分度值 DSNTIP4 安装面板v 是的
字符串分隔符 COBOL 字符串常量中使用的字符串分隔符 APOST预编译选项或DSNTIPF安装面板上的字符串分隔符 DSNTIPF安装面板上的字符串分隔符 False
sql_
string_
分隔符
常量中使用的SQL字符串分隔符 APOSTSQL预编译器选项或DSNTIPF安装面板上的SQL字符串分隔符 在DSNTIPF安装面板上设置SQL字符串分隔符
混合数据 使用混合DBCS数据 DSNTIPF安装面板上的混合数据 DSNTIPF安装面板上的混合数据
DECIMAL_
算术
当前精度规则,适用于十进制运算中两个操作数的精度均为15或更小的情况。 DEC(15)或DEC(31)预编译选项或小数点后保留两位小数,在 DSNTIP4 安装面板上 DSNTIP4 安装面板上的十进制运算
DATE_FORMAT 日期格式 DSNTIP4 安装面板上的预编译选项或日期格式 日期格式: DSNTIP4 安装面板
TIME_FORMAT 时间格式 在 DSNTIP4 安装面板上选择TIME pre-compiler选项或TIME FORMAT选项 时间格式在 DSNTIP4 安装面板上
FLOAT_FORMAT 浮点格式 FLOAT( S390 | IEEE)预编译器选项或FLOAT的默认值 S390 默认的浮动 S390 False
主机语言 母语 在DSNTIPF安装面板上选择HOST预编译选项或LANGUAGE DEFAULT DSNTIPF安装面板上的语言默认设置 False
字符集 字符集 CCSID(n)预编译选项或DSNTIPF安装面板上的EBCDIC CCSID DSNTIPF安装面板上的EBCDIC CCSID False
FOLD FOLD仅适用于HOST_LANGUAGE为C或CPP的情况。 否则折叠为空白。 HOST(C(FOL D)预编译选项或默认选项NO FOLD 默认不折叠 False
四舍五入 在对DECFLOAT数据进行算术和转换操作时使用的舍入模式。 四舍五入绑定选项 当前 DECFLOAT 舍入模式 特殊寄存器
注意 :在数据共享环境中,如果为组中的每个成员提供了单独的DSNHDECP模块,则数据共享组中所有成员的每个环境变量的DSNHDECP设置应相同,否则在创建多个列掩码或行权限时可能会出现错误。
COBOL 应用程序中静态 CREATE PERMISSION 语句指定的普通 SQL 标识符:
如果 CREATE PERMISSION 语句是 COBOL 应用程序中的静态语句,则在行权限定义中使用的普通 SQL 标识符不得遵循 COBOL 词( DSNH20474 ,原因代码 14)的命名规则。 他们必须遵循 Db2 SQL参考资料中“SQL标识符”一节所述的命名SQL标识符的规则。 例如,在行权限定义中不允许使用 COBOL 1ST-TIME 作为普通 SQL 标识符;应将其改为 FIRST_TIME,或将其放在分隔符中。
在应用行权限后,数据操作语句的编码方案和CCSID如下:
更改开始数据操作语句的编码方案和 CCSID 不会受到行权限的影响, Db2 会隐式应用行权限进行行访问控制。 对于不是带有Unicode列的EBCDIC表的目标表或参考表,行权限定义使用表的编码方案和CCSID进行评估。 对于带有 Unicode 列的 EBCDIC 目标表或引用表,将使用多编码方案规则评估行权限定义。更改结束
请注意 Db2 的限制:
如果数据操作语句已经接近语句中的某些 Db2 限制,则应注意,创建的启用行权限和启用列掩码越多,就越有可能影响某些限制。 例如,它们可能会导致语句超过需要排序和评估聚合函数(MULTIPLE DISTINCT和GROUP BY)的查询操作列的最大总长度(32600字节)。 这是因为当数据操作语句中引用表时,启用的列掩码和启用的行权限定义会隐式合并到语句中。 有关语句的限制,请参阅SQL参考中的“ Db2 for z/OS® 中的限制”。
涉及待定义变更的限制:
如果权限是在表上定义的,或者引用了有未定义更改的表,则不允许创建权限。

例子 CREATE PERMISSION

示例 1
在行权限中,安全的用户定义函数ACCOUNTING_UDF处理列SALARY中的敏感数据。 在员工表启用行访问控制后,会计保罗检索了EMPNO为123456的员工的工资,该员工年薪为10万美元。 根据用户自定义函数ACCOUNTING_UDF的输出值,Paul可能会看到或看不到该行。
CREATE PERMISSION SALARY_ROW_ACCESS ON EMPLOYEE
   FOR ROWS WHERE VERIFY_GROUP_FOR_USER(SESSION_USER,'MGR','ACCOUNTING') = 1
            AND
            ACCOUNTING_UDF(SALARY) < 120000
   ENFORCED FOR ALL ACCESS
   ENABLE;

COMMIT;

ALTER TABLE EMPLOYEE 
	ACTIVATE ROW ACCESS CONTROL;

COMMIT;

SELECT SALARY FROM EMPLOYEE 
   WHERE EMPNO = 123456;
示例 2
银行柜员只能访问其分行的客户。 所有出纳员都拥有辅助授权ID TELLER。 客户服务代表有权访问银行的所有客户。 所有客户服务代表均拥有二级授权ID CSR。 根据SECADM权限定义的访问规则,为银行中的每组人员创建一行权限。 在表 CUSTOMER 的行访问控制激活后,SELECT 语句中的两个行权限的搜索条件合并到语句中,并通过逻辑或运算符组合,以控制每个组可访问的行集。
CREATE PERMISSION TELLER_ROW_ACCESS ON CUSTOMER
   FOR ROWS WHERE VERIFY_GROUP_FOR_USER(SESSION_USER,'TELLER') = 1
            AND
            BRANCH = (SELECT HOME_BRANCH FROM INTERNAL_INFO
                         WHERE EMP_ID = SESSION_USER)
    ENFORCED FOR ALL ACCESS
    ENABLE;

COMMIT;

CREATE PERMISSION CSR_ROW_ACCESS ON CUSTOMER
   FOR ROWS WHERE VERIFY_GROUP_FOR_USER(SESSION_USER,'CSR') = 1
   ENFORCED FOR ALL ACCESS
   ENABLE;

COMMIT;

ALTER TABLE CUSTOMER 
   ACTIVATE ROW ACCESS CONTROL;

COMMIT;

SELECT * FROM CUSTOMER;