Rozumiem, że wyzwalacz w tabeli t zdefiniowanej za pomocą FOR EACH STATEMENT
zostanie uruchomiony raz, gdy wykonam polecenie an UPDATE t ...
.
Teraz, kiedy t
zostanie zdefiniowane za pomocą FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
i zaktualizuję N wierszy a
, czy spowoduje to, że wyzwalacz zostanie wywołany raz, czy N razy?
Innymi słowy, czy zmiany w tabeli kaskadowane przez ograniczenie FK są bardziej podobne do pojedynczego UPDATE
, czy raczej do serii UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Hanno Fietz
źródło
źródło
FOR EACH STATEMENT
jest prostopadła do reszty pytania. Ograniczenia FK są wdrażane za pomocą specjalnych wyzwalaczyFOR EACH ROW
.Odpowiedzi:
Ograniczenia klucza obcego są obecnie wdrażane za pomocą specjalnych wewnętrznych wyzwalaczy. Wszystkie są uruchomione
FOR EACH ROW
.Pamiętaj, że są to szczegóły implementacji, które można zmienić, więc nie polegaj na tym. Ale podstawy nie zmieniły się w ciągu ostatnich kilku głównych wersji, więc poważne zmiany są mało prawdopodobne.
Przeprowadziłem szybki test z prostym ograniczeniem FK od
tbl
dotbltype
. Prosty FK jest implementowany z czterema prostymi wewnętrznymi wyzwalaczamiFOR EACH ROW
w moim teście na str. 9.4.Oto krótki przegląd tego, jak przeprowadzić dochodzenie:
Włączone są dwa wewnętrzne „bezczynności”
tbltype
.Włączone dwa wewnętrzne „sprawdzanie”
tbl
.Wszystkie są uruchamiane
FOR EACH ROW
, jak wskazują nieparzyste liczby wtgtype
.2 bajty Postgres
tgtype smallint
reprezentująint16
kod źródłowy w C, w którym kodowany jest najmniej znaczący bitTRIGGER_TYPE_ROW
. Szczegółowe wyjaśnienie tutaj:Można łatwo sprawdzić to z pary identycznych wyzwalaczy gdzie jedyną zmianą
FOR ROW
/STATEMENT
...źródło
Wykonuje N razy, a najłatwiejszym sposobem, aby to sprawdzić, jest wykonanie instrukcji z
EXPLAIN ANALYZE
napisem poprzedzającym, tjOtrzymasz informacje podobne do tego:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(testowany z 9.2)
źródło