CREATE MASK sentencia
La sentencia CREATE MASK crea una máscara de columna en el servidor actual. Una máscara de columna se utiliza para el control de acceso a las columnas y especifica el valor que debe devolverse para una columna determinada.
Invocación para CREATE MASK
Esta sentencia puede incorporarse en un programa de aplicación o emitirse de forma interactiva. Es una instrucción ejecutable que puede prepararse dinámicamente solo si el comportamiento DYNAMICRULES RUN está activo. Para obtener más información, consulte ID de autorización y SQL dinámico.
Autorización para CREATE MASK
El conjunto de privilegios que se define a continuación debe incluir la siguiente autoridad:
- Autorización SECADM
La autorización SECADM puede crear una máscara de columna en cualquier esquema. No son necesarios privilegios adicionales para hacer referencia a otros objetos en la definición de máscara. Por ejemplo, el privilegio SELECT no es necesario para consultar una tabla, y el privilegio EXECUTE no es necesario para invocar una función definida por el usuario.
Conjunto de privilegios : si la declaración está incrustada en un programa de aplicación, el conjunto de privilegios es el conjunto de privilegios que posee el propietario del paquete. Si el estado se prepara dinámicamente, el conjunto de privilegios es el conjunto de privilegios que posee el ID de autorización SQL del proceso. Sin embargo, si el proceso se ejecuta en un contexto de confianza definido con la cláusula ROLE AS OBJECT OWNER AND QUALIFIER, el conjunto de privilegios es el conjunto de privilegios que posee el rol que está en vigor.
Sintaxis para CREATE MASK
descripción para CREATE MASK
- nombre-máscara
- Especifica los nombres de la máscara de columna. El nombre, incluido el calificador implícito o explícito, no debe identificar una máscara de columna o un permiso de fila que ya exista en el servidor actual.
- ON nombre-tabla
- Identifica la tabla para la que se crea la máscara de columna. El nombre debe identificar una tabla que exista en el servidor actual. No debe identificar ninguno de los siguientes objetos:
- Una tabla auxiliar
- Una tabla creada o declarada temporalmente.
- Una vista.
- Una tabla de catálogo
- Un alias
- Un sinónimo
- Una tabla de consulta materializada o una tabla a la que se hace referencia directa o indirectamente en la definición de una tabla de consulta materializada
- Una tabla que se ha creado implícitamente para una columna de XML
- Una tabla que contiene un punto
- Una tabla de historial
- Una mesa solo para aceleradores
- Una tabla habilitada para archivo
- Una tabla de archivo
- nombre-correlación
- Especifica un nombre de correlación que se puede utilizar dentro de la expresión-case para designar la tabla. Para obtener información sobre el nombre de correlación, consulte Nombres de correlación.
- FOR COLUMN nombre-columna
- Identifica la columna a la que se aplica la máscara. el nombre de la columna debe ser un nombre sin calificativos que identifique una columna de la tabla especificada. No debe existir ya una máscara para la columna. La columna no debe ser:
- una columna LOB o una columna de tipo distinto que se base en un LOB
- Una columna XML
- definido con un FIELDPROC
- RETURN caso-expresión
- Especifica una expresión de tipo " CASE " que determina el valor que se devuelve para la columna. El resultado de la expresión CASE se devuelve en lugar del valor de columna en una fila. El tipo de datos result, el atributo null, la longitud de datos, el subtipo, el esquema de codificación y el CCSID de la expresión CASE deben ser idénticos a los atributos de la columna especificada por column-name. Si el tipo de datos del nombre de columna es un tipo de datos definido por el usuario, el tipo de datos resultante de la expresión e CASE o debe ser el mismo tipo definido por el usuario. La expresión " CASE " no debe hacer referencia a ninguno de los siguientes objetos:
- Un objeto remoto
- La tabla para la que se está definiendo la máscara de columna
- Una tabla temporal global creada o una tabla temporal global declarada
- Una tabla auxiliar
- Una tabla que se ha creado implícitamente para una columna de XML
- Una columna que se ha definido con un FIELDPROC
- Una columna LOB o una columna de tipo distinto que se basa en una LOB
- Una columna XML
- Una notación de lista selecta
*oname.*en la cláusula SELECT - Una función de tabla
- Una tabla derivada de una colección (UNNEST)
- Una función definida por el usuario que se define como no segura
- Una función que no es determinista o que tiene una acción externa o se define con la opción MODIFIES SQL DATA
- Una función agregada, a menos que se especifique en una subconsulta
- Una función de tabla integrada
- Una función de tabla XMLTABLE
- Un predicado XMLEXISTS
- Una especificación OLAP
- Una expresión ROW CHANGE
- Una referencia de secuencia
- Una variable de host, variable SQL, parámetro SQL o variable de transición de activación
- Un marcador de parámetro
- Una referencia de tabla que contiene una especificación de punto
- Una vista que incluya cualquiera de las restricciones anteriores en su definición
- Una mesa solo para aceleradores
El esquema de codificación de la tabla se utiliza para evaluar la expresión e CASE. Las tablas y los elementos de lenguaje que requieran una evaluación de esquema de codificación múltiple, que no sean tablas EBCDIC con columnas Unicode, no deben ser referenciados en la expresión CASE. Véase Esquema de codificación y reglas CCSID para cadenas para elementos lingüísticos que requieren evaluación múltiple.
Si la expresión " CASE " hace referencia a tablas para las que el control de acceso de filas o columnas está activo, los controles de acceso para esas tablas no se aplican en cascada.
- DESACTIVAR o ENABLE
- Especifica que la máscara de columna se debe habilitar o inhabilitar para el control de acceso a columnas.
- DESACTIVAR
- Especifica que la máscara de columna se debe inhabilitar para el control de acceso a columnas. La máscara de columna permanecerá desactivada independientemente de si el control de acceso a la columna está activado para la tabla.
DESACTIVAR es el valor predeterminado.
- ENABLE
- Especifica que la máscara de columna se debe habilitar para el control de acceso a columnas. Si el control de acceso a las columnas no está activo actualmente para la tabla, la máscara de columnas se habilitará cuando se active el control de acceso a las columnas para la tabla. Si el control de acceso a la columna está activo actualmente para la tabla, la máscara de columna se habilita inmediatamente y todos los paquetes y sentencias en la caché de sentencias dinámicas que hacen referencia a la tabla se invalidan. Para obtener más información, consulte Cambios que invalidan los paquetes.
Notas para CREATE MASK
Ejemplos de CREATE MASK
En los siguientes ejemplos, el tipo de datos de la columna SSN es VARCHAR(11).
- Ejemplo 1
- Después de que se active el control de acceso a la columna para la tabla EMPLOYEE, Paul, del departamento de nóminas, puede ver el número de la seguridad social del empleado cuyo número de empleado es 123456. Mary, que es gerente, solo puede ver los cuatro últimos caracteres del número de la seguridad social. Peter, que no es ninguno de los dos, no puede ver el número de la seguridad social.
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; - Ejemplo 2
- En la instrucción SELECT, la columna SSN está incrustada en una expresión que es la misma que la expresión utilizada en la máscara de columna SSN_MASK. Después de activar el control de acceso a columnas para la tabla EMPLOYEE, la máscara de columna SSN_MASK se aplicará al SSN de columna en la sentencia SELECT. Para esta expresión en concreto, la sentencia SELECT produce el mismo resultado que antes de activar el control de acceso a columnas para todos los usuarios. El usuario puede reemplazar la expresión en la instrucción SELECT con la columna SSN para evitar que la misma expresión se evalúe dos veces.
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; - Ejemplo 3
- Un gobierno estatal realizó una encuesta sobre el uso de la biblioteca por parte de los hogares de cada ciudad. Participaron en el estudio cincuenta hogares de cada ciudad. A cada hogar se le dio la opción, de participar o no, de mostrar su uso en cualquier informe generado a partir del resultado de la encuesta.
Se utilizó una sentencia SELECT para generar un informe que mostrara el promedio de horas que dedicaba cada participante en cada ciudad. Se creó una máscara de columna CITY_MASK para enmascarar el nombre de la ciudad en función de la información de permiso o no permiso elegida por los participantes. Sin embargo, después de que se active el control de acceso a la columna para la tabla LIBRARY_USAGE, la instrucción SELECT recibe un error de tiempo de enlace. Esto ocurre porque la máscara de columna CITY_MASK hace referencia a otra columna LIBRARY_OPT y LIBRARY_OPT no identifica una columna de agrupación.
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; - Ejemplo 4
- El empleado con EMPNO 123456 gana una bonificación de 8000 $ y un salario de 80000 $ en mayo. Cuando el gerente recupera su salario, recibe su salario y no un valor nulo. Esto ocurre porque se no ha definido el efecto cascada cuando la máscara de columna SALARY_MASK hace referencia a la columna BONUS para la cual se ha definido la máscara de columna 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; - Ejemplo 5
- Este ejemplo muestra que Db2 añade "WHEN target-column IS NULL THEN NULL" como la primera cláusula WHEN a la definición de la máscara de columna y, a continuación, fusiona la definición de la máscara de columna en la sentencia.
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;
