PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A cláusula CHECK para visualizações atualizáveis


Escrito por Giuseppe Broccolo





Desde o PostgreSQL 9.3, é possível atualizar e inserir diretamente nas visualizações, desde que a visualização se refira a apenas uma tabela subjacente.

O PostgreSQL 9.4 nos permite usar a cláusula CHECK para INSERTs em visualizações atualizáveis. Por exemplo, considere uma tabela composta por apenas uma coluna inteira; e considere duas visualizações, uma sobre números divisíveis por 2 e outra sobre números divisíveis por 3. Se tentarmos inserir o número 123 na primeira visualização:

—-

$ CREATE TABLE some_data(id int4 PRIMARY KEY);

CRIAR A TABELA

$ CREATE VIEW primeiro AS SELECT * FROM some_data WHERE 0 =id%2;

CRIAR VISUALIZAÇÃO

$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id%3;

CRIAR VISUALIZAÇÃO

$ INSERT INTO first(id) VALUES (123);

—-

Ele será inserido na tabela subjacente, mesmo que a visualização seja apenas para números divisíveis por 2 (portanto, o novo valor não será visível na visualização). No PostgreSQL 9.4, a cláusula CHECK foi introduzida para gerenciar corretamente os INSERTs nas visualizações, verificando antecipadamente se os valores são compatíveis com a definição da visualização.

Existem duas opções possíveis:

* VERIFICAÇÃO EM CASCATA – esta é a opção padrão, onde as verificações são em cascata para outras visualizações definidas na mesma tabela subjacente

* LOCAL CHECK – apenas a view que é alvo de um INSERT é verificada

Aqui é mostrado como usar a cláusula CHECK no exemplo acima:

—-

$ DROP VIEW primeiro;

RETIRAR VISUALIZAÇÃO

$ DROP VIEW segundo;

RETIRAR VISUALIZAÇÃO

$ CREATE VIEW primeiro AS SELECT * FROM some_data WHERE 0 =id % 2 WITH CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ CREATE VIEW second AS SELECT * FROM some_data WHERE 0 =id % 3 WITH CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ INSERT INTO first(id) VALUES (14);

INSERIR 0 1

$ INSERT INTO first(id) VALUES (15);

ERRO:  a nova linha viola WITH CHECK OPTION para a visualização "first"

$ INSERT INTO second(id) VALUES (15);

INSERIR 0 1

$ INSERT INTO third(id) VALUES (6);

INSERIR 0 1

$ INSERT INTO third(id) VALUES (15);

ERRO:  a nova linha viola WITH CHECK OPTION para a visualização "first"

Observe que a visão “terceira” é definida na visão “primeira”.

O valor '14' é inserido corretamente na primeira visualização, enquanto o valor '15' pode ser inserido apenas na segunda, não na primeira - como esperado. Podemos inserir '6' na terceira visão porque é divisível por 3 e 2. O erro ao inserir '15' na terceira visão, mesmo sendo divisível por 3, é porque viola a cláusula CHECK divisível por 2 na visualização pai, primeiro. Nesse caso, não é suficiente usar uma cláusula LOCAL CHECK em ambas as visualizações para contornar o problema:

—-

$ DROP VIEW primeiro;

RETIRAR VISUALIZAÇÃO

$ DROP VIEW terceiro;

RETIRAR VISUALIZAÇÃO

$ CREATE VIEW first AS SELECT * FROM some_data WHERE 0 =id % 2 WITH LOCAL CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH LOCAL CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ INSERT INTO third(id) VALUES (15);

ERRO:  a nova linha viola WITH CHECK OPTION para a visualização "first"

—-

O exemplo de trabalho é mostrado aqui:

—-

$ DROP VIEW primeiro;

RETIRAR VISUALIZAÇÃO

$ DROP VIEW terceiro;

RETIRAR VISUALIZAÇÃO

$ CREATE VIEW primeiro AS SELECT * FROM some_data WHERE 0 =id % 2;

CRIAR VISUALIZAÇÃO

$ CREATE VIEW third AS SELECT * FROM first WHERE 0 =id % 3 WITH LOCAL CHECK OPTION;

CRIAR VISUALIZAÇÃO

$ INSERT INTO third(id) VALUES (15);

INSERIR 0 1

—-

Conclusões


Este novo mecanismo de verificação pode ser aplicado diretamente em visualizações atualizáveis ​​durante a fase INSERT. Reforça cada vez mais o papel do banco de dados na manutenção da integridade dos dados.