Różnica między wyzwalaczami FOR i AFTER?

Odpowiedzi:

153

Nie ma różnicy, robią to samo.

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

Jest taki sam jak

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

INSTEAD OFWyzwalacz jest inny, a pożary przed i zamiast wkładki i mogą być wykorzystane w widokach, w celu wprowadzenia odpowiednich wartości w tabelach bazowych.

Ben
źródło
14
Podobał mi się komentarz dotyczący wstawiania do widoków za pomocą wyzwalaczy. Bardzo przydatne informacje. Twoje zdrowie.
Mariusz
Przepraszam, panie @Ben, jaki byłby scenariusz wstawienia do widoku? Dzięki ^ - ^
Jeancarlo Fontalvo
@JeancarloFontalvo, 1) kompatybilność. Tabele bazowe mogą ulec zmianie, pod warunkiem że widok pozostaje ten sam. 2) kontrola dostępu, niektórzy użytkownicy mogą mieć uprawnienia do zapisu tylko w określonych kolumnach.
Ben
17

@Ben ma całkowitą rację.

Oto artykuł MSDN Exploring SQL Server Triggers

Akapit z artykułu:

Ta składnia jest również akceptowalna w starszych wersjach SQL Server. Jednakże teraz, gdy istnieją dwa typy wyzwalaczy w SQL Server 2000, wolę nazywać wyzwalacze FOR jako wyzwalacze PO. Dlatego przez pozostałą część tego artykułu będę odnosić się do wyzwalaczy PO lub ZAMIAST.

Podobnie jak wyzwalacz AFTER, który widziałeś wcześniej, ten wyzwalacz zapobiega wprowadzaniu zmian w polu lastname. Jednak implementuje tę regułę biznesową inaczej niż w poprzednim przykładzie. Ponieważ wyzwalacz INSTEAD OF jest uruchamiany zamiast instrukcji UPDATE, wyzwalacz INSTEAD OF ocenia, czy test reguły biznesowej zakończy się pomyślnie, czy nie. Jeśli test reguły biznesowej zakończy się pomyślnie, aby aktualizacja nastąpiła, wyzwalacz INSTEAD OF musi jawnie ponownie wywołać instrukcję UPDATE.

Waqas Raja
źródło
4

AFTER określa, że ​​wyzwalacz DML jest uruchamiany tylko wtedy, gdy wszystkie operacje określone w wyzwalającej instrukcji SQL zostały pomyślnie wykonane. Wszystkie referencyjne akcje kaskadowe i sprawdzenia ograniczeń również muszą się powieść, zanim ten wyzwalacz zostanie uruchomiony. AFTER jest ustawieniem domyślnym, gdy FOR jest jedynym określonym słowem kluczowym.

Wyzwalaczy AFTER nie można definiować w widokach.

INSTEAD OF Określa, że ​​wyzwalacz DML jest wykonywany zamiast wyzwalającej instrukcji SQL, w związku z czym przesłania akcje instrukcji wyzwalających. Nie można określić INSTEAD OF dla wyzwalaczy DDL lub logowania.

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql

Nour El-Hoda
źródło
1
To wyrażenie „AFTER jest ustawieniem domyślnym, gdy FOR jest jedynym określonym słowem kluczowym”. jest bardzo zagmatwany. Mogliby lepiej to sformułować.
FMFF