sql >> Base de Datos >  >> RDS >> PostgreSQL

La cláusula CHECK para vistas actualizables

Escrito por Giuseppe Broccolo 

Desde PostgreSQL 9.3, es posible actualizar e insertar vistas directamente, siempre que la vista se refiera a una sola tabla subyacente.

PostgreSQL 9.4 nos permite usar la cláusula CHECK para INSERT en vistas actualizables. Por ejemplo, considere una tabla compuesta por una sola columna de enteros; y considere dos vistas, una sobre números divisibles por 2 y otra sobre números divisibles por 3. Si intentamos insertar el número 123 en la primera vista:

—-

$ CREAR TABLA some_data(id int4 CLAVE PRINCIPAL);

CREAR TABLA

$ CREAR VISTA primero COMO SELECCIONAR * DESDE some_data WHERE 0 =id%2;

CREAR VISTA

$ CREAR VISTA segundo COMO SELECCIONAR * DESDE algunos_datos DONDE 0 =id%3;

CREAR VISTA

$ INSERTAR EN PRIMEROS (id) VALORES (123);

—-

Se insertará en la tabla subyacente, aunque la vista sea solo para números divisibles por 2 (por lo que el nuevo valor no será visible en la vista). En PostgreSQL 9.4, se introdujo la cláusula CHECK para administrar correctamente los INSERT en las vistas al verificar de antemano que los valores sean compatibles con la definición de la vista.

Hay dos opciones posibles:

* COMPROBACIÓN EN CASCADA:esta es la opción predeterminada, donde las comprobaciones se conectan en cascada a otras vistas definidas en la misma tabla subyacente

* COMPROBACIÓN LOCAL:solo se comprueba la vista que es el objetivo de un INSERTAR

Aquí se muestra cómo usar la cláusula CHECK en el ejemplo anterior:

—-

$ DROP VIEW primero;

SOLTAR VISTA

$ DROP VIEW segundo;

SOLTAR VISTA

$ CREAR VISTA primero COMO SELECCIONAR * DESDE algunos_datos DONDE 0 =id % 2 CON OPCIÓN DE COMPROBACIÓN;

CREAR VISTA

$ CREAR VISTA segundo COMO SELECCIONAR * DESDE algunos_datos DONDE 0 =id % 3 CON OPCIÓN DE COMPROBACIÓN;

CREAR VISTA

$ CREAR VISTA tercero COMO SELECCIONAR * DESDE el primero DONDE 0 =id % 3 CON OPCIÓN DE COMPROBACIÓN;

CREAR VISTA

$ INSERTAR EN PRIMEROS (id) VALORES (14);

INSERTAR 0 1

$ INSERTAR EN PRIMERA(id) VALORES (15);

ERROR:  la nueva fila infringe CON OPCIÓN DE VERIFICACIÓN para la vista "primera"

$ INSERTAR EN los segundos (id) VALORES (15);

INSERTAR 0 1

$ INSERTAR EN VALORES de terceros (id) (6);

INSERTAR 0 1

$ INSERTAR EN VALORES de terceros (id) (15);

ERROR:  la nueva fila infringe CON OPCIÓN DE VERIFICACIÓN para la vista "primera"

Tenga en cuenta que la vista "tercera" se define en la vista "primera".

El valor '14' se inserta correctamente en la primera vista, mientras que el valor '15' se puede insertar solo en la segunda, no en la primera, como se esperaba. Podemos insertar '6' en la tercera vista porque es divisible por 3 y 2. El error de insertar '15' en la tercera vista aunque sea divisible por 3 se debe a que viola la cláusula CHECK de divisible por 2 en la vista principal, primero. En este caso, no es suficiente usar una cláusula LOCAL CHECK en ambas vistas para solucionar el problema:

—-

$ DROP VIEW primero;

SOLTAR VISTA

$ DROP VIEW tercero;

SOLTAR VISTA

$ CREAR VISTA primero COMO SELECCIONAR * DESDE algunos_datos DONDE 0 =id % 2 CON OPCIÓN DE COMPROBACIÓN LOCAL;

CREAR VISTA

$ CREAR VISTA tercero COMO SELECCIONAR * DESDE el primero DONDE 0 =id % 3 CON OPCIÓN DE VERIFICACIÓN LOCAL;

CREAR VISTA

$ INSERTAR EN VALORES de terceros (id) (15);

ERROR:  la nueva fila infringe CON OPCIÓN DE VERIFICACIÓN para la vista "primera"

—-

El ejemplo de trabajo se muestra aquí:

—-

$ DROP VIEW primero;

SOLTAR VISTA

$ DROP VIEW tercero;

SOLTAR VISTA

$ CREAR VISTA primero COMO SELECCIONAR * DESDE algunos_datos DONDE 0 =id % 2;

CREAR VISTA

$ CREAR VISTA tercero COMO SELECCIONAR * DESDE el primero DONDE 0 =id % 3 CON OPCIÓN DE VERIFICACIÓN LOCAL;

CREAR VISTA

$ INSERTAR EN VALORES de terceros (id) (15);

INSERTAR 0 1

—-

Conclusiones

Este nuevo mecanismo de verificación se puede aplicar directamente en las vistas actualizables durante la fase INSERTAR. Refuerza cada vez más el papel de la base de datos en el mantenimiento de la integridad de los datos.