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.