CREATE MASK 语句
CREATE MASK语句在当前服务器上创建一个列掩码。 列掩码用于列访问控制,并指定应返回给指定列的值。
调用 CREATE MASK
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
授权 CREATE MASK
以下定义的特权集必须包含以下权限:
- SECADM 权限
SECADM 权限可以在任何模式中创建列掩码。 在蒙版定义中引用其他对象无需其他权限。 例如,查询表不需要SELECT权限,调用用户定义的函数也不需要EXECUTE权限。
权限集: 如果该语句嵌入在应用程序中,则权限集是包的所有者所拥有的权限的集合。 如果语句是动态准备的,则权限集是指由进程的 SQL 授权 ID 持有的权限集。 但是,如果进程在可信环境中运行,且可信环境由 ROLE AS OBJECT OWNER AND QUALIFIER 子句定义,则权限集是指当前角色所拥有的一组权限。
语法 CREATE MASK
描述 CREATE MASK
- 假名
- 指定列掩码的名称。 名称(包括隐式或显式限定符)不得标识当前服务器上已存在的列掩码或行权限。
- ON 表名
- 标识创建列掩码的表格。 名称必须标识当前服务器上存在的表。 不得识别以下任何物体:
- 辅助表格
- 已创建的临时表或者已声明的临时表
- 一个视图
- 目录表
- 别名
- 同义词
- 在物化查询表的定义中直接或间接引用的物化查询表或表
- 为 XML 列隐式创建的表
- 包含一个句号的表格
- 历史表
- 只含加速器的表格
- 启用存档功能的表格
- 档案表
- 相关名称
- 指定一个可以在 case-expression 中使用的关联名称来指定表。 关于相关名称的信息,请参阅相关名称。
- FOR COLUMN 列名
- 标识蒙版所应用的列。 列名必须是一个无限制的名称,用于标识指定表的列。 该列不能已存在掩码。 专栏不得:
- LOB列或基于LOB的独立类型列
- XML 列
- 由FIELDPROC定义
- RETURN 案例表达
- 指定一个 CASE 表达式,用于确定列返回的值。 将返回 CASE 表达式的结果来代替行中的列值。 CASE 表达式的结果数据类型、空属性、数据长度、子类型、编码方案和CCSID必须与列名指定的列的属性相同。 如果列名的数据类型是用户定义的数据类型,则 CASE 表达式的结果数据类型必须与用户定义的类型相同。 CASE 表达不得涉及以下任何对象:
- 一个遥远的物体
- 定义列掩码的表格
- 已创建的全局临时表或已声明的全局临时表
- 辅助表格
- 为 XML 列隐式创建的表
- 使用 FIELDPROC 定义的列
- 基于LOB的LOB列或单独类型列
- XML 列
- SELECT子句中的列表符号
*
或name.*
- 表函数
- 衍生自收藏的桌子(UNNEST)
- 用户自定义函数,定义为不安全
- 非确定性函数或具有外部作用或使用MODIFIES SQL DATA选项定义的函数
- 聚合函数,除非在子查询中指定
- 内置表格功能
- XMLTABLE表函数
- XMLEXISTS 谓词
- OLAP 规范
- ROW CHANGE 表达式
- 顺序引用
- 宿主变量、SQL变量、SQL参数或触发器转换变量
- 参数标记
- 包含时间规格的表格参考
- 在定义中包含上述任何限制的观点
- 只含加速器的表格
表格中的编码方案用于评估 CASE 表达式。 除了带有Unicode列的EBCDIC表之外, CASE 表达式中不得引用需要评估多种编码方案的表和语言元素。 请参阅确定字符串的编码方案和CCSID ,了解需要多次计算的语言元素。
如果 CASE 表达式引用了行或列访问控制处于活动状态的表,则这些表的访问控制不会级联。
- 禁用或 ENABLE
- 指定启用或禁用列掩码,以进行列访问控制。
- 禁用
- 指定在列访问控制中禁用列掩码。 无论是否启用表格的列访问控制,列掩码都将保持禁用状态。
默认值为禁用。
- ENABLE
- 指定启用列掩码以进行列访问控制。 如果当前未对表启用列访问控制,则在表启用列访问控制后,列掩码将启用。 如果当前对表启用了列访问控制,则列掩码立即启用,动态语句缓存中引用该表的所有程序包和语句都将失效。 更多信息,请参阅 “导致套餐失效的变更 ”。
备注 CREATE MASK
例子 CREATE MASK
在以下示例中,SSN列的数据类型为VARCHAR(11)。
- 示例 1
- 在员工表启用列访问控制后,薪资部门的保罗可以看到员工编号为123456的员工的社保号码。 身为经理的玛丽只能看到社会保险号码的最后四个字符。 彼得既看不到社保号。
CREATE MASK SSN_MASK ON EMPLOYEE FOR COLUMN SSN RETURN CASE WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'PAYROLL') = 1) THEN SSN WHEN (VERIFY_GROUP_FOR_USER(SESSION_USER,'MGR') = 1) THEN 'XXX-XX-' || SUBSTR(SSN,8,4) ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SSN FROM EMPLOYEE WHERE EMPNO = 123456;
- 示例 2
- 在 SELECT 语句中,SSN 列嵌入在表达式中,该表达式与列掩码 SSN_MASK 中使用的表达式相同。 在表 EMPLOYEE 中启用列访问控制后,SELECT 语句中的 SSN 列将应用列掩码 SSN_MASK。 对于这种特殊表达,SELECT语句在所有用户启用列访问控制之前产生的结果与之前相同。 用户可以用列SSN替换SELECT语句中的表达式,以避免相同的表达式被计算两次。
CREATE MASK SSN_MASK ON EMPLOYEE FOR COLUMN SSN RETURN CASE WHEN (1 = 1) THEN 'XXX-XX-' || SUBSTR(SSN,8,4) ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT 'XXX-XX-' || SUBSTR(SSN,8,4) FROM EMPLOYEE WHERE EMPNO = 123456;
- 示例 3
- 州政府针对每个城市的家庭图书馆使用情况进行了调查。 每个城市有50户家庭接受了调查。 每个家庭都可以选择是否在调查产生的报告中显示他们的使用情况。
SELECT语句用于生成报告,显示每个城市家庭平均使用的时间。 CITY_MASK列掩码用于根据抽样家庭选择的加入或退出信息来屏蔽城市名称。 然而,在表 LIBRARY_ USAGE 的列访问控制被激活后,SELECT 语句收到绑定时间错误。 这是因为列掩码 CITY_MASK 引用了另一列 LIBRARY_OPT,而 LIBRARY_OPT 不是分组列。
CREATE MASK CITY_MASK ON LIBRARY_USAGE FOR COLUMN CITY RETURN CASE WHEN (LIBRARY_OPT = 'OPT-IN') THEN CITY ELSE ' ' END ENABLE; COMMIT; ALTER TABLE LIBRARY_USAGE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT CITY, AVG(LIBRARY_TIME) FROM LIBRARY_USAGE GROUP BY CITY;
- 示例 4
- 员工编号为EMPNO 123456的员工在5月份获得了8000美元的奖金和80000美元的工资。 当经理领取工资时,他收到的是工资,而不是零值。 这是因为当列掩码 SALARY_MASK 引用列 BONUS 时,列掩码 BONUS_MASK 已经定义,不会出现级联效应。
CREATE MASK SALARY_MASK ON EMPLOYEE FOR COLUMN SALARY RETURN CASE WHEN (BONUS < 10000) THEN SALARY ELSE NULL END ENABLE; COMMIT; CREATE MASK BONUS_MASK ON EMPLOYEE FOR COLUMN BONUS RETURN CASE WHEN (BONUS > 5000) THEN NULL ELSE BONUS END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SALARY FROM EMPLOYEE WHERE EMPNO = 123456;
- 示例 5
- 这个示例显示, Db2 将“WHEN target-column IS NULL THEN NULL”作为第一个WHEN子句添加到列掩码定义中,然后将列掩码定义合并到语句中。
CREATE EMPLOYEE (EMPID INT, DEPTID CHAR(8), SALARY DEC(9,2) NOT NULL, BONUS DEC(9,2)); CREATE MASK SALARY_MASK ON EMPLOYEE FOR COLUMN SALARY RETURN CASE WHEN SALARY < 10000 THEN CAST(SALARY*2 AS DEC(9,2)) ELSE COALESCE(CAST(SALARY/2 AS DEC(9,2)), BONUS) END ENABLE; COMMIT; CREATE MASK BONUS_MASK ON EMPLOYEE FOR COLUMN BONUS RETURN CASE WHEN BONUS > 1000 THEN BONUS ELSE NULL END ENABLE; COMMIT; ALTER TABLE EMPLOYEE ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT SALARY FROM DEPT LEFT JOIN EMPLOYEE ON DEPTNO = DEPTID; /* When SALARY_MASK is merged into the above statement, * 'WHEN SALARY IS NULL THEN NULL' is added as the * first WHEN clause, as follows: */ SELECT CASE WHEN SALARY IS NULL THEN NULL WHEN SALARY < 10000 THEN CAST(SALARY*2 AS DEC(9,2)) ELSE COALESCE(CAST(SALARY/2 AS DEC(9,2)), BONUS) END SALARY FROM DEPT LEFT JOIN EMPLOYEE ON DEPTNO = DEPTID;