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

Leer diagrama de sintaxisOmitir el diagrama de sintaxis visualCREATE MASKnombre-máscaraONnombre-tabla ASnombre-correlaciónFOR COLUMNnombre-columnaRETURNexpresión-caseDISABLEENABLE

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 * o name.* 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

Inicio del cambioEl 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.fin del cambio

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

Cómo afectan las máscaras de columna a las consultas

La aplicación de máscaras de columna habilitadas no interfiere con las operaciones de otras cláusulas dentro de la sentencia, como WHERE, GROUP BY, HAVING, SELECT DISTINCT u ORDER BY. Las filas devueltas en la tabla de resultados final permanecen iguales, salvo que puede que las máscaras de columna hayan enmascarado los valores de las filas resultantes. Por lo tanto, si la columna enmascarada también aparece en una cláusula ORDER BY con una expresión de clave de ordenación, el orden se basa en los valores originales de la columna y los valores enmascarados en la tabla de resultados finales podrían no reflejar ese orden. Del mismo modo, los valores enmascarados podrían no reflejar la singularidad impuesta por una instrucción SELECT DISTINCT o una función COUNT (expresión DISTINCT). Si la columna enmascarada está incluida en una expresión, el resultado de la expresión podría ser distinto porque la máscara de columna se aplica a la columna antes de que se realice la evaluación de la expresión.

Conflictos entre la definición de una máscara de columna y SQL
Se crea una máscara de columna como un objeto independiente, sin conocer todos los contextos en los que podría utilizarse. Para enmascarar el valor de una columna en la tabla de resultados finales, la definición de la máscara de columna se fusiona en una consulta mediante Db2. Cuando la definición de la máscara de columna se introduce en el contexto de la sentencia, puede entrar en conflicto con cierta semántica SQL en la sentencia. Por lo tanto, en algunas situaciones, la combinación del enunciado y la aplicación de la máscara de columna puede devolver un error. Cuando esto ocurre, es necesario modificar el estado de cuenta o eliminar la máscara de columna o volver a crearla con una definición diferente. Consulte la instrucción ALTER TABLE para conocer aquellas situaciones en las que se podría producir un error de tiempo de enlace para la instrucción.
Máscaras de columna y columnas nulas
Si la columna no es anulable, la definición de su máscara de columna no considerará, muy probablemente, un valor nulo para la columna. Después de que se active el control de acceso a la columna para la tabla, si la tabla es la tabla rellenada con valores nulos en una combinación externa, el valor de la columna en la tabla de resultados finales podría ser nulo. Para garantizar que la máscara de columna pueda enmascarar un valor nulo, si la tabla es la tabla rellenada con valores nulos en una unión externa, Db2 Agregará " WHEN columna de destino IS NULL THEN NULL " como la primera cláusula WHEN de la definición de máscara de columna. Esto obliga a que un valor nulo se enmascare siempre como un valor nulo. Para una columna nula, esto elimina la capacidad de enmascarar un valor nulo como otra cosa. El ejemplo 5 muestra esta cláusula WHEN añadida.
Valores de máscara de columna para instrucciones de modificación de datos SQL
Cuando se utilizan columnas para derivar nuevos valores para una instrucción INSERT, UPDATE, MERGE o una instrucción SET de asignación de variables de transición, se utilizan los valores originales de la columna, no los valores enmascarados, para derivar los nuevos valores. Si las columnas tienen máscaras de columna, dichas máscaras se aplican para garantizar que la evaluación de las reglas de control de acceso en tiempo de ejecución enmascare la columna a sí misma, no a una constante o a una expresión. Esto es para asegurar que los valores enmascarados son los mismos que los valores originales de la columna. Si una máscara de columna no enmascara la columna a sí misma, la fila existente no se actualiza o la nueva fila no se inserta y se devuelve un error en tiempo de ejecución. Las reglas que se utilizan para aplicar máscaras de columna con el fin de derivar los nuevos valores siguen las mismas reglas para la tabla de resultados finales de una consulta.
Máscaras de columna que se crean antes de que se active el control de acceso a la columna
La sentencia CREATE MASK es una sentencia independiente que puede utilizarse para crear una máscara de control de acceso a columnas antes de que se active el control de acceso a columnas para una tabla. El único requisito será que la tabla y las columnas existan antes de crear la máscara. Se pueden crear varias máscaras de columna para una tabla, pero una columna sólo puede tener una máscara.

La definición de una máscara se almacena en el catálogo de Db2 . Se registrará la dependencia de la tabla para la cual se está creando la máscara y las dependencias de otros objetos a los que se hace referencia en la definición. No se invalidará ningún paquete o sentencia en memoria caché dinámicas. Se puede crear una máscara de columna como habilitada o inhabilitada para el control de acceso a columnas. Una máscara de columna habilitada no entra en vigor hasta que se utiliza la sentencia ALTER TABLE con la cláusula ACTIVATE COLUMN ACCESS CONTROL para activar el control de acceso a columnas para la tabla. Se necesita la autorización SECADM para emitir una sentencia ALTER TABLE. Una máscara de columna inhabilitada sigue sin ser efectiva incluso cuando el control de acceso a columnas está activado para la tabla. Se puede utilizar la sentencia ALTER MASK para alternar entre ENABLE y DISABLE.

Después de que se active el control de acceso a las columnas de una tabla, cuando se haga referencia a la tabla en una instrucción de manipulación de datos, Db2 aplicará implícitamente todas las máscaras de columna habilitadas que se hayan creado para la tabla con el fin de enmascarar los valores devueltos para las columnas a las que se hace referencia en la tabla de resultados finales de las consultas o para determinar los nuevos valores utilizados en las instrucciones de modificación de datos.

Consejo : Para evitar múltiples invalidaciones de paquetes y sentencias dinámicas en caché que hacen referencia a la tabla, cree máscaras de columna antes de activar el control de acceso a las columnas de una tabla.
Máscaras de columna que se crean después de activar el control de acceso a la columna
Las máscaras de columna habilitadas se hacen efectivas en cuanto se confirman. Todos los paquetes y las sentencias en memoria caché dinámicas que hacen referencia a la tabla se invalidan. A partir de entonces, cuando se hace referencia a la tabla en una sentencia de manipulación de datos, Db2 aplica implícitamente a la sentencia todas las máscaras de columna habilitadas. Cualquier máscara de columna deshabilitada permanece inoperativa incluso cuando el control de acceso a la columna está activado para la tabla.
No hay efecto en cascada cuando se hace referencia a tablas con control de acceso de columna o fila en definiciones de máscara de columna
Una definición de máscara de columna puede hacer referencia a tablas y columnas que actualmente se aplican mediante el control de acceso de filas o columnas. El control de acceso de estas tablas y columnas se ignora cuando se hace referencia a la tabla para la cual se está creando la máscara de columna en una sentencia de manipulación de datos.
Múltiples máscaras de columna y permisos de fila que comparten las mismas variables de entorno
Se pueden crear varias máscaras de columna y permisos de fila para una tabla. Deben utilizar el mismo conjunto de variables de entorno. El conjunto de variables de entorno se determina cuando se crea la máscara de la primera columna o el permiso de fila para la tabla.

La tabla de catálogo SYSENVIRONMENT contiene la lista de variables de entorno. La siguiente tabla muestra qué variable de entorno debe ser la misma entre las múltiples máscaras de columna y permisos de fila.

Tabla 1. Variables de entorno en SYSIBM.SYSENVIRONMENT
Variables de entorno mostradas como columnas SYSENVIRONMENT Descripción Estática crear declaración Sentencia CREATE dinámica ¿Debe ser el mismo entre varias máscaras de columna y permisos de fila?
ENVID Identificador interno del entorno Asignado por Db2 Asignado por Db2 true
CURRENT_SCHEMA El calificador utilizado para calificar objetos no calificados como tablas, vistas. etc. Propietario del paquete Valor del registro especial CURRENT_SCHEMA true
MAPAS La ruta de esquema utilizada para calificar objetos no calificados, como funciones definidas por el usuario y funciones CAST para tipos de datos definidos por el usuario. Opción de enlace PATH Valor del registro especial CURRENT_PATH true
APLICACIÓN_
CODIFICACIÓN_
CCSID
El CCSID del entorno de la aplicación Opción de enlace ENCODING Registro especial CURRENT APPLICATION ENCODING SCHEME true
ORIGINAL_
ENCODING_
CCSID
El CCSID original de la cadena de texto de la declaración Opción de precompilador CCSID(n) o CCSID EBCDIC en el panel de instalación DSNTIPF CCSID basado en el ESQUEMA DE CODIFICACIÓN DEF en el panel de instalación DSNTIPF true
PUNTO_DECIMAL El indicador de punto decimal Opción de precompilador COMA o PUNTO o PUNTO DECIMAL ACTIVADO en el panel de instalación DSNTIPF EL PUNTO DECIMAL ESTÁ en el panel de instalación DSNTIPF true
MIN_DIVIDE_SCALE La escala de división mínima ESCALA DE DIVISIÓN MÍNIMA en el panel de instalación de DSNTIP4 ESCALA DE DIVISIÓN MÍNIMA en el panel de instalación de DSNTIP4
DELIMITADOR_DE_CADENA El delimitador de cadena que se utiliza en las constantes de cadena de COBOL Opción de precompilador APOST o STRING DELIMITER en el panel de instalación DSNTIPF DELIMITADOR DE CADENAS en el panel de instalación DSNTIPF Nee
SQL_
STRING_
DELIMITER
El delimitador de cadena SQL que se utiliza en las constantes Opción de precompilador APOSTSQL o DELIMITADOR DE CADENA SQL en el panel de instalación DSNTIPF DELIMITADOR DE CADENA SQL en el panel de instalación DSNTIPF true
DATOS_MIXTOS Utiliza datos DBCS mixtos DATOS MIXTOS en el panel de instalación DSNTIPF DATOS MIXTOS en el panel de instalación DSNTIPF true

O DECIMAL ARITMÉTICO
Las reglas que se deben utilizar para la PRECISIÓN ACTUAL y cuando ambos operandos en una operación decimal tienen una precisión de 15 o menos. Opción de precompilador DEC(15) o DEC(31) o ARITMÉTICA DECIMAL en el panel de instalación de DSNTIP4 ARITMÉTICA DECIMAL en el panel de instalación de DSNTIP4 true
DATE_FORMAT El formato de fecha Opción DATE pre-compiler o DATE FORMAT en el panel de instalación de DSNTIP4 FORMATO DE FECHA en el panel de instalación de DSNTIP4 true
TIME_FORMAT El formato de la hora Opción de precompilador TIME o FORMATO DE HORA en el panel de instalación de DSNTIP4 FORMATO DE HORA en el panel de instalación de DSNTIP4 true
FORMATO FLOTANTE El formato de punto flotante Opción de precompilador FLOAT ( S390 | IEEE) o predeterminado de FLOAT S390 Incumplimiento de FLOAT S390 Nee
IDIOMA_ANFITRIÓN El idioma de acogida Opción de precompilador HOST o IDIOMA POR DEFECTO en el panel de instalación DSNTIPF IDIOMA PREDETERMINADO en el panel de instalación de DSNTIPF Nee
JUEGOCAR El conjunto de caracteres Opción de precompilador CCSID(n) o CCSID EBCDIC en el panel de instalación DSNTIPF EBCDIC CCSID en el panel de instalación DSNTIPF Nee
Plegar FOLD solo es aplicable cuando HOST_LANGUAGE es C o CPP. De lo contrario, FOLD está en blanco. Opción del precompilador HOST(C(FOL D) o valor predeterminado NO FOLD predeterminado de SIN PLIEGO Nee
ROUNDING El modo de redondeo que se utiliza cuando se realizan operaciones aritméticas y de conversión en datos DECFLOAT. REDONDEO opción de enlace CURRENT DECFLOAT ROUNDING MODE, registro especial true
Nota : En un entorno de intercambio de datos, si se proporciona un módulo DSNHDECP independiente para cada miembro del grupo, la configuración de DSNHDECP para cada variable de entorno debe ser la misma en todos los miembros del grupo de intercambio de datos; de lo contrario, podría producirse un error al crear varias máscaras de columna o permisos de fila.
Identificadores SQL ordinarios especificados en una sentencia CREATE MASK estática en una aplicación COBOL :
Si la sentencia CREATE MASK es una sentencia estática en una aplicación COBOL, los identificadores SQL ordinarios utilizados en la definición de la máscara de columna no deben seguir las reglas de denominación de palabras de COBOL. Deben seguir las reglas para nombrar identificadores en SQL. Por ejemplo, la palabra COBOL 1ST-TIME no está permitida como identificador SQL ordinario en una definición de máscara de columna; cámbiela por FIRST_TIME o colóquela en los delimitadores.
Esquema de codificación y CCSID de la declaración de manipulación de datos después de aplicar las máscaras de columna:
Inicio del cambioEl esquema de codificación y los CCSID de la declaración de manipulación de datos no se ven afectados por las máscaras de columna que Db2 aplica implícitamente para el control de acceso a las columnas. Para una tabla de destino o una tabla de referencia que no sea una tabla EBCDIC con columnas Unicode, la definición de la máscara de columna se evalúa utilizando el esquema de codificación y los CCSID de su tabla. Para una tabla de destino o una tabla de referencia que sea una tabla EBCDIC con columnas Unicode, la definición de la máscara de columna se evalúa utilizando las reglas para múltiples esquemas de codificación.fin del cambio
Consideración de los límites de la Db2 :
Si la declaración de manipulación de datos ya se acerca a algunos límites e Db2 , debe tenerse en cuenta que cuantas más máscaras de columna y permisos de fila habilitados se creen, más probable es que afecten a algunos límites. Por ejemplo, pueden hacer que la declaración exceda la longitud total máxima (32600 bytes) de las columnas de una operación de consulta que requiera ordenar y evaluar funciones agregadas (MULTIPLE DISTINCT y GROUP BY). Esto ocurre porque las definiciones de máscara de columna y los permisos de fila habilitados están fusionados de forma implícita en la sentencia cuando se hace referencia a la tabla en la sentencia de manipulación de datos. Consulte "Límites en Db2 for z/OS®" en Referencia SQL para conocer los límites de una instrucción.
Restricciones relacionadas con cambios de definición pendientes:
No se permite CREATE MASK si la máscara se define en una tabla o hace referencia a una tabla que tiene cambios de definición pendientes.

Ejemplos de CREATE MASK

Inicio del cambioEn los siguientes ejemplos, el tipo de datos de la columna SSN es VARCHAR(11).fin del cambio

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;