Eu entendo que um gatilho na tabela t definido com FOR EACH STATEMENT
será executado uma vez quando eu executar um UPDATE t ...
.
Agora, quando t
é definido com FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
, e eu atualizo N linhas a
, isso fará com que o acionador seja chamado uma vez ou N vezes?
Em outras palavras, as alterações em uma tabela em cascata por uma restrição de FK são mais como uma única UPDATE
ou mais como uma série de UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
fonte
fonte
FOR EACH STATEMENT
é ortogonal ao resto da questão. As restrições de FK são implementadas com gatilhos especiaisFOR EACH ROW
.Respostas:
Atualmente, as restrições de chave estrangeira são implementadas com gatilhos internos especiais. Todos eles são executados
FOR EACH ROW
.Observe que esses são detalhes de implementação que podem mudar, portanto, não confie neles. Mas o básico não mudou nas últimas duas versões principais, portanto, mudanças importantes são improváveis.
Fiz um teste rápido com uma restrição FK simples de
tbl
paratbltype
. Um FK simples é implementado com quatro gatilhos internos simplesFOR EACH ROW
no meu teste na página 9.4.Aqui está um rápido resumo de como investigar:
Dois "noaction" interno são ativados
tbltype
.Dois "cheques" internos são ativados
tbl
.Todos eles são executados
FOR EACH ROW
, conforme indicado pelos números ímpares emtgtype
.Os 2 bytes do Postgres
tgtype smallint
representam umint16
código fonte em C onde o bit menos significativo é codificadoTRIGGER_TYPE_ROW
. Explicação detalhada aqui:Você pode facilmente testar isso com um par de gatilhos idênticos, onde você só muda
FOR ROW
/STATEMENT
...fonte
Ele executa N vezes, e a maneira mais fácil de ver isso é executar a instrução com um
EXPLAIN ANALYZE
anexo, ieIsso fornecerá informações semelhantes a esta:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(testado com 9.2)
fonte