O comando SET CONSTRAINTS define o comportamento da verificação da restrição dentro da transação corrente. No modo IMMEDIATE (imediato), as restrições são verificadas ao final de cada comando. No modo DEFERRED (postergado), as restrições não são verificadas até o momento da efetivação da transação (commit). Cada restrição possui seu próprio modo IMMEDIATE ou DEFERRED. [1] [2]
Ao ser criada, a restrição sempre recebe uma destas três características: DEFERRABLE INITIALLY DEFERRED (postergável, inicialmente postergada), DEFERRABLE INITIALLY IMMEDIATE (postergável, inicialmente imediata), ou NOT DEFERRABLE (não postergável). A terceira classe é sempre IMMEDIATE (imediata) e não é afetada pelo comando SET CONSTRAINTS. As duas primeiras classes começam todas as transações no modo indicado, mas seus comportamentos podem ser modificados dentro da transação pelo comando SET CONSTRAINTS.
O comando SET CONSTRAINTS com uma lista de nomes de restrição muda o modo destas restrições apenas (que devem ser todos postergáveis). Se existirem várias restrições correspondendo a um nome fornecido, todos eles são afetados. O comando SET CONSTRAINTS ALL muda o modo de todas as restrições postergáveis.
Quando o comando SET CONSTRAINTS muda o modo da restrição de DEFERRED para IMMEDIATE, o novo modo passa a valer retroativamente: toda modificação de dados remanescente, que deveria ter sido verificada no final da transação, será verificada durante a execução do comando SET CONSTRAINTS. Se alguma destas restrições estiver violada, o comando SET CONSTRAINTS falhará (e não mudará o modo da restrição). Portanto, o comando SET CONSTRAINTS pode ser utilizado para obrigar que ocorra a verificação das restrições em um determinado ponto da transação.
Atualmente, somente as restrições de chave estrangeira são afetadas por esta definição. As restrições de verificação (check) e de unicidade são sempre não postergáveis.
Este comando somente altera o comportamento das restrições dentro da transação corrente. Portanto, se este comando for executado fora de um bloco de transação (par BEGIN/COMMIT), parecerá que não produziu nenhum efeito.
Este comando está em conformidade com o comportamento definido no padrão SQL, exceto pela limitação que, no PostgreSQL, somente se aplica às restrições de chave estrangeira.
O padrão SQL diz que os nomes das restrições que aparecem no comando SET CONSTRAINTS podem ser qualificados pelo esquema. Esta funcionalidade ainda não é suportada pelo PostgreSQL: os nomes não podem ser qualificados, e todas as restrições correspondendo ao comando serão afetadas, não importando o esquema em que estejam.
[1] |
4.7.1 — Verificação da restrição — Existem dois tipos de objeto do esquema que descrevem restrições: asserções e restrições de tabela (incluindo as restrições de domínio de qualquer domínio sobre o qual uma coluna da tabela pode estar baseada), e são verificados da mesma maneira. Toda restrição é postergável ou não postergável. Em toda sessão SQL, toda restrição possui um modo da restrição que é uma propriedade desta sessão SQL. Cada restrição possui um modo da restrição padrão (persistente), com o qual a restrição começa cada transação SQL de cada sessão SQL. O modo da restrição é postergado ou imediato, e pode ser definido por um comando SQL, desde que a restrição seja postergável. Quando a transação é iniciada, o modo da restrição de cada restrição é definido como o seu modo padrão. Ao completar a execução de todo comando SQL, toda restrição cujo modo é imediato é verificada. Antes de terminar a transação, todo modo da restrição é definido como imediato (e, portanto, verificado). (ISO-ANSI Working Draft) Framework (SQL/Framework), August 2003, ISO/IEC JTC 1/SC 32, 25-jul-2003, ISO/IEC 9075-1:2003 (E) (N. do T.) |
[2] |
Oracle — O comando SET CONSTRAINTS é utilizado para especificar, para uma transação em particular, se a restrição postergável será verificada após cada comando da DML ou quando a transação for efetivada. Pode ser verificado se as restrições postergáveis serão bem-sucedidas antes de efetivá-las submetendo o comando SET CONSTRAINTS ALL IMMEDIATE. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |