CREATE TRIGGER (Transact-SQL)
Tworzy DML, DDLlub logowania wyzwalacza.Wyzwalacz jest specjalnym rodzajem procedura składowana , wykonującego automatycznie po wystąpieniu zdarzenie na serwerze bazy danych.DML wyzwala wykonać podczas modyfikowania danych przy użyciu język edycji danych (DML) zdarzenie.ZdarzeniaDML są INSERT, UPDATE lub usuwanie instrukcji na tabela lub widoku.Te wyzwalacze ognia, gdy wszelkie ważne zdarzenie jest uruchamiany, niezależnie od tego, czy dotyczy wszystkich wierszy tabela .
DDL wyzwala wykonać w odpowiedzi na różne zdarzenia języka (DDL) definicja danych .Zdarzenia te odnoszą się przede wszystkim do Transact-SQL instrukcji CREATE, ALTER i UPUSZCZANIA oraz niektórych procedury składowane w systemie wykonanie DDL-takich jak operacje.Ustanawia się ognia wyzwalaczy logowania w odpowiedzi logowania zdarzenie jest wywoływane, gdy sesji użytkownika.Wyzwalacze mogą być tworzone bezpośrednio z Transact-SQL sprawozdania lub od metod zespoły, które są tworzone w Microsoft .NET Framework plików wykonywalnych języka wspólnego (CLR) i przekazać do wystąpienie SQL Server.SQL ServerUmożliwia tworzenie wielu wyzwalaczy dla wszelkich szczególnych instrukcja.
Uwaga dotycząca zabezpieczeń |
---|
Złośliwy kod wewnątrz Wyzwalacze mogą być uruchamiane uprawnienia escalated.Aby uzyskać więcej informacji o tym, jak zmniejszyć zagrożenie, zobacz Zarządzanie zabezpieczeniami wyzwalacza. |
Składnia
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)
CREATE TRIGGER [ schema_name . ]trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }
<dml_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)
CREATE TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }
<ddl_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
Trigger on a LOGON event (Logon Trigger)
CREATE TRIGGER trigger_name
ON ALL SERVER
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR| AFTER } LOGON
AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] }
<logon_trigger_option> ::=
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
<method_specifier> ::=
assembly_name.class_name.method_name
Argumenty
schema_name
Jest to nazwa schematu, do której należy dany wyzwalacz DML .WyzwalaczeDML są obejmuje zasięgiem schematu tabela lub widoku, na którym są tworzone.schema_namenie można określić dla Wyzwalacze DDL lub logowania.trigger_name
Jest to nazwa wyzwalacza.A trigger_name muszą być zgodne z zasadami identyfikatorów, chyba że trigger_name nie może zaczynać się od # lub ##.table | view
Jest tabela lub widoku, na którym jest wykonywane i jest czasem określana jako wyzwalacz widoku tabela lub wyzwalacza wyzwalaczy DML .Określanie w pełni kwalifikowaną nazwę tabela lub widoku jest opcjonalne.Widok można odwoływać się tylko wyzwalacza INSTEAD OF.WyzwalaczeDML nie można zdefiniować na tabelach tymczasowych lokalna czy globalna.BAZY DANYCH
Dotyczy zakres wyzwalacza DDL bieżącej bazy danych.Jeśli określony, wyzwalacz przy każdym fires event_type lub event_group występuje w bieżącej bazie danych.WSZYSTKIE SERWERA
Stosuje się zakres wyzwalacza DDL lub logowania do bieżącego serwera.Jeśli określony, wyzwalacz przy każdym fires event_type lub event_group występuje w dowolnym miejscu bieżącego serwera.Z SZYFROWANIEM
Obfuscates tekst utworzyć WYZWALACZ instrukcja.Korzystanie z szyfrowania uniemożliwia wyzwalacz publikowana jako część SQL Server replikacja.Nie można określić Z SZYFROWANIEM wyzwalaczy CLR.WYKONANIE JAKO
Określa kontekst zabezpieczeń, w ramach którego wyzwalacz jest wykonywany.Umożliwia kontrolę wystąpienie konta użytkownika, który z SQL Server używa do sprawdzania poprawności uprawnień obiektom bazy danych, które odwołują się wyzwalacza.Aby uzyskać więcej informacji, zobacz WYKONANIE klauzuli (Transact-SQL).
DLA | PO
Po Określa, że wyzwalacz DML jest uruchamiany tylko podczas wszystkich operacji określonych w wyzwalającegoinstrukcja SQLzostała wykonana pomyślnie. Wszystkie akcje więzów kaskadowo i ograniczenia kontroli również musi się zakończyć powodzeniem przed fires tego wyzwalacza.PO jego domyślny podczas dla jest tylko słowo kluczowe określone.
Nie można zdefiniować po wyzwalaczy w widokach.
ZAMIAST
Określa, że wyzwalacz DML jest wykonywany zamiast wyzwolenieinstrukcja SQL, dlatego, przesłanianie akcje wyzwalającego sprawozdania. Zamiast tego nie można określić z wyzwalaczy DDL lub logowania.Co najwyżej jedną zamiast wyzwalacza seryjnego na INSERT, UPDATE lub DELETE instrukcja mogą być zdefiniowane w tabela lub widoku.Można jednak definiować widoki na widokach, gdzie każdy widok ma swój własny zamiast wyzwalacza.
INSTEAD OF wyzwalacze nie są dozwolone aktualizowalna widoków, które korzystają z opcji sprawdzania.SQL Serverzgłasza błąd podczas dodawania do poddający się aktualizacji widok Z Sprawdź, czy określono OPCJĘ wyzwalacza INSTEAD OF.Użytkownik musi usunąć tę opcję za pomocą ALTER VIEW przed zdefiniowaniem wyzwalacza INSTEAD OF.
{ [DELETE] , ] [INSERT] , [AKTUALIZACJI]}
Określa instrukcji modyfikacji danych, które aktywowania wyzwalacza DML , gdy zostanie podjęta próba przeciwko tej tabela lub widoku.Należy określić co najmniej jedną opcję.Dowolna kombinacja tych opcji w dowolnej kolejności jest dozwolony w definicji wyzwalacza.Aby zamiast wyzwalaczy, opcji usuwania nie jest dozwolona na tabele, które mają relacji więzy Określanie Kaskadowo akcja na usuwanie.Podobnie opcja aktualizacji nie jest dozwolona na tabele, które mają relacji więzy Określanie Kaskadowo akcja na AKTUALIZACJĘ.
event_type
Jest to nazwa Transact-SQL języka zdarzenie , która po wykonaniu, powoduje wyzwalacz DDL pożaru.Zdarzenia ważne dla Wyzwalacze DDL są wymienione w Zdarzenia DDL.event_group
Jest nazwą wstępnie grupowanie Transact-SQL zdarzenia języka.Wyzwalacz DDL fires po wykonaniu każdej Transact-SQL języka zdarzenie , który należy do event_group.Ważne zdarzenie grup Wyzwalacze DDL są wymienione w Grupy zdarzeń DDL.Po zakończeniu tworzenia WYZWALACZA, event_group działa również jako makra dodając typy zdarzenie , które on obejmuje do sys.trigger_events wykazu widoku.
Z APPEND
Określa, że należy dodać dodatkowe wyzwalacza istniejącego typu.Z DOŁĄCZAJĄCEJ nie można używać z zamiast wyzwalaczy lub, jeśli po jawny wyzwalacza.Dołącz może być używane tylko wtedy, gdy dla jest określona, bez INSTEAD OF lub po, ze względu na zgodność ze starszymi wersjami.Z DOŁĄCZAJĄCEJ nie można określić Jeśli określono nazwę zewnętrznego (Jeśli wyzwalacz jest wyzwalacz CLR).Ważne: Z Dołącz zostaną usunięte w następnej wersja Microsoft SQL Server.Nie korzystać Z DOŁĄCZYĆ w nowych prac rozwojowych i plan do modyfikowania aplikacji, które obecnie korzystają.
NIE DLA REPLIKACJI
Wskazuje, że wyzwalacz nie powinna być uruchamiana, gdy agent replikacja modyfikuje tabela jest zaangażowany w wyzwalacz.Aby uzyskać więcej informacji, zobacz Kontrolowanie ograniczenia, tożsamości i wyzwalaczy z nie dla replikacji.sql_statement
Jest wyzwalacz warunków i akcji.Warunki wyzwalacza określ dodatkowe kryteria, które określają, czy tried DML, DDLlub zdarzenia logowania powodować akcje wyzwalacza ma być wykonana.Akcje wyzwalacza, określone w Transact-SQL instrukcji uwzględniona podczas nieudanej operacji.
Wyzwalacze mogą zawierać dowolny numer i rodzaj z Transact-SQL instrukcji z wyjątkami.Aby uzyskać więcej informacji zobacz Spostrzeżenia.Wyzwalacz jest zaprojektowane aby sprawdzić lub zmienić danych w oparciu o dane modyfikacji lub definicji instrukcja; należy zwraca dane użytkownika.Transact-SQL Instrukcji w wyzwalacz, często zawierają język sterowania przepływem.
Użyj wyzwalaczyDML deleted i inserted logiczny tabel (Ogólne).Są one strukturalnie podobnych do tabela zdefiniowano wyzwalacz, oznacza to, że w tabela na którym zostanie podjęta próba akcja użytkownika.deleted i inserted tabele zawierają stare wartości lub nowych wartości wierszy, które mogą być zmieniane przez użytkownika akcja.Na przykład, aby pobrać wszystkie wartości w deleted tabela, użyj:
SELECT * FROM deleted
Aby uzyskać więcej informacji, zobacz Za pomocą tabel wstawionych i usuniętych.
WyzwalaczeDDL i logowania przechwytywania informacji o wyzwalającego zdarzenie przy użyciu EVENTDATA (Transact-SQL)funkcja. Aby uzyskać więcej informacji, zobacz Funkcja EVENTDATA.
SQL ServerUmożliwia aktualizację z text, ntext, lub image kolumn do INSTEAD OF wyzwolić w tabelach lub widokach.
Ważne: ntext, text, i image typów danych zostaną usunięte w przyszłej wersja programu Microsoft SQL Server.Należy unikać stosowania tych typów danych w nowych prac rozwojowych i plan do modyfikowania aplikacji, które używają obecnie.Użycie nvarchar(max), varchar(max), i varbinary(max) w zamian.Po i zamiast z wyzwala obsługi varchar(MAX), nvarchar(MAX), i varbinary(MAX) danych w inserted i deleted tabele.
< method_specifier >
wyzwalacz CLROkreśla metoda wirtualny plik dziennika powiązać z wyzwalaczem.metoda musi mieć nie argumentów i zwrot void.class_namemusi być prawidłową SQL Server identyfikatora i musi istnieć jako klasa w wirtualny plik dziennika z wirtualny plik dziennika widoczność.Jeśli klasa ma kwalifikowanej nazw nazwa używana "." do oddzielania części obszaru nazw, nazwa klasy musi rozdzielany za pomocą [] lub " " ograniczniki.Klasa nie może być zagnieżdżone klasy.Ostrzeżenie
Domyślnie, zdolność SQL Server do uruchomienia środowiska CLR kodu jest wyłączony.Tworzenie, modyfikowanie i usuwanie obiektów bazy danych, które odwołują się do modułów kod zarządzany , ale te odwołania zostaną nie wykonać w wystąpienie SQL Server chyba że clr włączona opcja jest włączone za pomocą sp_configure.
Uwagi
WyzwalaczeDML
WyzwalaczeDML są często używane do wymuszania reguły biznesowe i integralność danych.SQL Serverzapewnia deklaratywna integralność referencyjna (DRI Declarative Referential) za pomocą instrukcji ALTER TABLE i CREATE TABLE.Funkcja DRI nie zapewnia jednak między bazami danych więzy integralność.Więzy integralność odnosi się do reguł dotyczących relacji pomiędzy kluczami podstawowymi i obcych tabele.Aby wymusić więzy integralność, użyj ograniczeń klucza podstawowego i klucza OBCEGO w instrukcji ALTER TABLE i CREATE TABLE.Jeśli istnieją ograniczenia na wyzwalacza tabela, są sprawdzane po wykonaniu wyzwalacza INSTEAD OF i przed wykonaniem po wyzwalacza.Ograniczenia są naruszone, akcje wyzwalacza INSTEAD OF są przywracane, a po uruchomieniu nie wyzwalacza.
Pierwszy i ostatni po Wyzwalacze wykonywane na tabela można określić za pomocą sp_settriggerorder.Tylko jeden ostatni po wyzwalacza pierwszy i jeden dla każdego INSERT, UPDATE i operacji usuwania może być określony w tabela.Istnieją inne wyzwalaczy po na tej samej tabelasą losowo wykonywane.
Jeśli WYZWALACZ ZMIENIA instrukcja zmienia wyzwalacza pierwszego lub ostatniego, pierwszego lub ostatniego atrybut zestaw na zmodyfikowanego wyzwalacza jest przenoszony i wartość zamówienia należy zresetować za pomocą sp_settriggerorder.
Wyzwalacz po jest wykonywane tylko wtedy, gdy wyzwalającegoinstrukcja SQLzostała wykonana pomyślnie. To pomyślne wykonanie obejmuje wszystkie akcje więzów kaskadowo i ograniczenia kontroli skojarzone z obiektem zaktualizowany lub usunięty.
Jeśli wyzwalacza INSTEAD OF, zdefiniowane w tabela wykonuje instrukcja tabela będzie zwykle ponownie uruchomienie wyzwalacza INSTEAD OF, wyzwalacz nie jest wywoływana rekursywnie.Zamiast tego instrukcja jest przetwarzane tak, jakby tabela nie miał zamiast wyzwalaczy i uruchamia łańcucha ograniczenie działań i po wykonania wyzwalacza.Na przykład jeśli wyzwalacz jest zdefiniowany jako wyzwalacz INSTEAD OF WSTAW tabelai wyzwalacza wykonuje INSERT instrukcja na tej samej tabela, instrukcja INSERT, wykonywane przez wyzwalacza INSTEAD OF nie wywołuje wyzwalacz ponownie.WSTAW wykonywane przez wyzwalacz rozpoczyna się proces wykonywania czynności, ograniczenia i wyzwalania wszelkie Wyzwalacze po WSTAWIĆ zdefiniowanych dla tabela.
Jeśli wyzwalacza INSTEAD OF, zdefiniowane na widok wykonuje instrukcja przeciwko widok, który będzie zwykle ognia ponownie wyzwalacza INSTEAD OF, nie jest wywoływana rekursywnie.Zamiast tego instrukcja problem został rozwiązany modyfikacje przeciwko tabel bazowych będącej podstawą widoku.W tym przypadekdefinicja widoku musi spełniać wszystkie ograniczenia poddający się aktualizacji widok.Definicję widoki mogą być aktualizowane, Modyfikowanie danych przy użyciu widoku.
Na przykład jeśli wyzwalacz jest zdefiniowany jako wyzwalacza INSTEAD OF aktualizacja w widoku i wyzwalacza wykonuje AKTUALIZACJĘ instrukcja , odwoływanie się do tego samego widoku, wykonywane przez wyzwalacza INSTEAD OF UPDATE instrukcja nie wywołuje wyzwalacz ponownie.Aktualizacja wykonywane przez wyzwalacz jest przetwarzany przeciwko widok tak, jakby widoku nie ma wyzwalacza INSTEAD OF.Kolumny zmienione przez tę AKTUALIZACJĘ można rozpoznać pojedynczej tabela bazowa.Każda modyfikacja tabela bazowa podstawowej uruchamia łańcucha stosowania ograniczeń i wyzwalania po wyzwalaczy zdefiniowanych dla tabela.
Testowanie aktualizacji lub akcje WSTAW do określonych kolumn
Można zaprojektować Transact-SQL wyzwalacz do wykonywania pewnych działań na podstawie aktualizacji lub WSTAW zmiany w określonych kolumnach.Użycie UPDATE() lub COLUMNS_UPDATED w treści wyzwalacza w tym celu.Update() testy dla prób aktualizacji lub WSTAW w jednej kolumna.COLUMNS_UPDATED badań dla akcji UPDATE lub INSERT, które są wykonywane na wiele kolumn i zwraca wzorzec bitowy , który wskazuje kolumny, które zostały wstawione lub zaktualizowane.
Ograniczenia wyzwalacza
Tworzenie WYZWALACZA musi być pierwsza instrukcja w partia i można zastosować tylko do jednej tabela.
Wyzwalacz zostanie utworzony tylko w bieżącej bazie danych; Jednakże wyzwalacza można odwoływać się obiekty poza bieżącej bazy danych.
Jeżeli określono nazwę schematu wyzwalacza w celu zakwalifikowania wyzwalacz, kwalifikują się nazwę tabela w taki sam sposób.
Tym samym wyzwalacza akcja można zdefiniować dla więcej niż jednego użytkownika akcja (na przykład, INSERT i UPDATE) w tej samej instrukcjatworzenia WYZWALACZA.
ZAMIAST wyzwalaczy OF DELETE/UPDATE nie można zdefiniować w tabela , która ma klucz obcy z opcją cascade na DELETE/UPDATE akcja zdefiniowany.
Wewnątrz wyzwalacza można określić dowolny zestaw instrukcja .ZESTAW opcji obowiązuje podczas wykonywania wyzwalacza, a następnie przywraca poprzednie ustawienia.
Po wyzwalacz, wyniki są zwracane do aplikacji wywołującej, podobnie jak z procedur przechowywanych.Aby zapobiec posiadające wyniki zwróconych do aplikacji z powodu opalanych wyzwalacz nie zawierają instrukcji SELECT, które zwracają wyniki albo instrukcji, które wykonują przypisanie zmiennej w wyzwalacz.Wyzwalacz, który zawiera instrukcje SELECT, które zwracają wyniki dla użytkownika albo instrukcji, które wykonują przypisanie zmiennej wymaga specjalnego traktowania; te zwracane wyniki będą musiały zapisane w każdej aplikacji mogą modyfikacje wyzwalacza tabela .Przypisanie zmiennej musi wystąpić w wyzwalacz, użyj instrukcję SET NOCOUNT instrukcja na początku wyzwalacz do uniknięcia powrotu wszystkie zestawy wyników.
Chociaż OBCIĄĆ tabelę instrukcja obowiązuje DELETE instrukcja, nie aktywuje wyzwalacza, ponieważ operacja nie rejestruje usunięcia pojedynczego wiersza.Jednak tylko użytkownicy z uprawnieniami do wykonać OBCIĄĆ tabelę instrukcja konieczne, należy zwracać uwagę na przypadkowo obejścia wyzwalacz usunięcia w ten sposób.
WRITETEXT instrukcjaczy zarejestrowanych lub niezarejestrowanych, nie uaktywnia wyzwalacza.
Następujące Transact-SQL instrukcje nie są dozwolone w wyzwalaczu DML :
ZMIEŃ BAZĘ DANYCH |
TWORZENIE BAZY DANYCH |
UPUŚĆ BAZĘ DANYCH |
OBCIĄŻENIE BAZY DANYCH |
DZIENNIK OBCIĄŻENIA |
ZMIEŃ KONFIGURACJĘ |
PRZYWRACANIE BAZY DANYCH |
PRZYWRACANIE DZIENNIKA |
|
Ponadto następujące Transact-SQL instrukcje nie są dozwolone wewnątrz ciała wyzwalacza DML użyto przeciwko tabela lub widoku, miejsce docelowe wyzwalającego akcja.
Tworzenie INDEKSU (w tym tworzenie PRZESTRZENNEJ indeks i Utwórz indeks XML) |
ZMIANA INDEKSU |
USUWANIE INDEKSU |
DBCC DBREINDEX |
FUNKCJA PARTITION ALTER |
USUNĄĆ TABELĘ |
ALTER TABLE użyto, wykonaj następujące czynności:
|
|
|
Ostrzeżenie
Ponieważ SQL Server nie obsługuje zdefiniowane przez użytkownika wyzwalaczy w tabele systemowe, zaleca się w tabele systemowenie zostanie utworzony przez użytkownika wyzwalaczy.
WyzwalaczeDDL
DDL wyzwala, takich jak standardowe wyzwalacze, wykonać procedur przechowywanych w odpowiedzi na zdarzenie.Jednak w przeciwieństwie do standardowych wyzwalacze, jak wykonać w odpowiedzi na aktualizacji, WSTAWIANIA lub usuwania instrukcji na tabela lub widoku.Zamiast tego są przede wszystkim wykonać w odpowiedzi na definicja danych instrukcji języka (DDL).Obejmują one instrukcji CREATE, ALTER, DROP, GRANT, ODMÓW, REVOKE i aktualizacji statystyk.Niektóre procedury składowane w systemie wykonanie DDL-takich jak operacje można także ognia Wyzwalacze DDL .
Ważne: |
---|
Test Wyzwalacze DDL , aby określić ich odpowiedzi na wykonanie procedura składowana systemu.Na przykład utworzyć typ instrukcja oraz sp_addtype i sp_rename procedury przechowywanej zostanie zastosowana wyzwalacza DDL , utworzonego na CREATE_TYPE zdarzenie. |
Aby uzyskać więcej informacji na temat Wyzwalacze DDL , zobacz Wyzwalacze DDL.
WyzwalaczeDDL nie uruchamiaj w odpowiedzi na zdarzenia, które mają wpływ na lokalnej lub globalnej tabel tymczasowych i procedur przechowywanych.
W odróżnieniu od DML wyzwalaczy Wyzwalacze DDL nie jest objęty zakresem do schematów.W związku z tym funkcji, takich jak OBJECT_ID, nazwa_obiektu, OBJECTPROPERTY i OBJECTPROPERTYEX nie można używać do wykonywania kwerend metadane dotyczących Wyzwalacze DDL .W zamian za pomocą widoki wykazu .Aby uzyskać więcej informacji, zobacz Pobieranie informacji O Wyzwalacze DDL.
Ostrzeżenie
Serwer o zakresie Wyzwalacze DDL są wyświetlane w SQL Server Management Studio Object Explorer w wyzwalaczy folder.Ten folder znajduje się w Obiektów serwerów folder.Wyzwalacze DDL zakresu bazy danych są wyświetlane w Bazy danych wyzwalacze folder.Ten folder znajduje się w programowania folder bazy danych.
Wyzwalacze logowania
Wyzwalacze logowania wykonać procedur przechowywanych w odpowiedzi logowania zdarzenie.To zdarzenie jest wywoływane, gdy sesja użytkownika jest ustalana z wystąpienie SQL Server.Wyzwalacze logowania ognia po fazie uwierzytelnianie rejestrowania zakończeniu, ale zanim użytkownik faktycznie jest ustanawiana sesja .Dlatego wszystkie komunikaty pochodzące z wewnątrz wyzwalacz, który zazwyczaj docierają użytkownika, takie jak komunikaty o błędach i komunikaty z wydruku instrukcjasą kierowane do SQL Server dziennik błędów.Aby uzyskać więcej informacji, zobacz Wyzwalaczy logowania.
Wyzwalacze logowania nie uruchamiaj, jeśli uwierzytelnianie nie powiedzie się.
Transakcji rozproszonych nie są obsługiwane w wyzwalaczu logowania.Kiedy wyzwalacz logowania zawierające transakcja rozproszona jest uruchamiany, zwracany jest błąd 3969.
Względy ogólne wyzwalacza
Zwracanie wyników
Możliwość zwracają wyniki z wyzwalacze zostaną usunięte w przyszłej wersja SQL Server.Wyzwalacze, które zwracają zestawów wyników może spowodować nieoczekiwane zachowanie w aplikacjach, które nie są przeznaczone do pracy z nimi.Plan do modyfikowania aplikacji, które aktualnie tym i uniknięcia zwracać zestawów wyników z wyzwalaczy nowych prac rozwojowych.Aby uniemożliwić zwrócenie wyników wyzwalaczy zestawów, zestaw uniemożliwić wyniki z opcji wyzwalaczy na 1.
Wyzwalacze logowania nie zawsze Zezwalaj zestawy wyniki zwracanych i to zachowanie nie jest konfigurowany.Wyzwalacz logowania wygenerować, zestaw wyników, wykonać wyzwalacz nie powiedzie się, a próba logowania, który uruchamiany wyzwalacz jest zabroniony.
Wiele wyzwalaczy
SQL Serverzezwala na wiele wyzwalaczy ma być utworzony dla każdego DML, DDLlub logowania zdarzenie.Na przykład jeśli tworzenia WYZWALACZA aktualizacja jest wykonywana dla tabela , która już ma wyzwalacza aktualizacji, jest tworzony wyzwalacza dodatkowa aktualizacja.W starszych wersjach SQL Server, tylko jeden wyzwolić dla każdego INSERT, UPDATE lub DELETE modyfikacji danych zdarzenie jest dozwolone dla każdej tabela.
Wyzwalacze cykliczne
SQL ServerUmożliwia również cykliczne wywołania wyzwalaczy, gdy jest włączone ustawienie RECURSIVE_TRIGGERS przy użyciu ZMIEŃ bazę danych.
Wyzwalacze cykliczne włączyć następujące rodzaje rekursji występują:
Pośrednie rekursji
Z pośrednich rekursji aplikacji aktualizuje tabela T1.Fires to wyzwalacz TR1, aktualizowania tabela T2.W tym scenariuszu wyzwolenia T2 następnie fires i aktualizuje tabela T1.
Bezpośrednie rekursji
Z rekursji bezpośredniego stosowania aktualizuje tabela T1.Fires to wyzwalacz TR1, aktualizowania tabela T1.Ponieważ tabela T1 został zaktualizowany, uruchamiać TR1 uruchamiany ponownie i tak dalej.
Poniższy przykład używa rekursji zarówno wyzwalacza pośrednimi i bezpośrednimi Przyjmij obecność dwóch aktualizacji wyzwalaczy, TR1 i TR2, są zdefiniowane w tabela T1.Wyzwalacz TR1 aktualizacji tabela T1 rekursywnie.Aktualizacja instrukcja wykonuje każdy TR1 i TR2 czas.Ponadto wykonanie TR1 wyzwala wykonanie TR1 (przez rekurencję) i TR2.inserted i deleted tabel dla określonego wyzwalacza zawiera wiersze, które odpowiadają tylko aktualizacja instrukcja , wywoływane wyzwalacza.
Ostrzeżenie
Poprzednie zachowanie występuje tylko wtedy, gdy jest włączone ustawienie RECURSIVE_TRIGGERS za pomocą ZMIEŃ bazę danych.Jest niezdefiniowanej kolejności wykonywania wiele wyzwalaczy zdefiniowany dla określonego zdarzenie .Każdy wyzwalacz powinny być niezależne.
Wyłączenie ustawienia RECURSIVE_TRIGGERS zapobiega jedynie bezpośrednie recursions.Aby wyłączyć rekursję pośrednie również zestaw nested triggers server opcji do 0, przy użyciu sp_configure.
Jeśli dowolny Wyzwalacze przeprowadza TRANSAKCJĘ ROLLBACK, niezależnie od zagnieżdżenia poziomwięcej wyzwalacze nie są wykonywane.
Zagnieżdżonych wyzwalaczy
Wyzwalacze można zagnieździć maksymalnie 32 poziomy.Jeśli zmiany wyzwalacza tabela , na którym jest inny wyzwalacza, drugi wyzwalacza jest aktywowany i można następnie wywołania wyzwalacza trzeciego itd.Każdy wyzwalacz w łańcuchu ustawia nieskończoną pętlę, przekroczył poziom zagnieżdżenia, a wyzwalacz zostanie anulowane.Gdy Transact-SQL wyzwalacza wykonuje kod zarządzany , odwołując się do środowiska CLR rutynowych, typ lub wartość zagregowana, to odwołanie liczy się jako jeden poziom przeciwko 32 -poziom zagnieżdżania limit.Limit ten nie są uwzględniane metody wywoływane z kod zarządzany
Aby wyłączyć zagnieżdżonych wyzwalaczy, zestaw nested triggers opcji sp_configure na 0 (wyłączone).Domyślna konfiguracja zezwala zagnieżdżonych wyzwalaczy.Jeśli nested triggers jest wyłączony, recursive triggers jest również wyłączona, niezależnie od RECURSIVE_TRIGGERS ustawienie zestaw za pomocą ALTER DATABASE.
Ostrzeżenie
W SQL Server 2000, każdy po wyzwalacza zagnieżdżone wewnątrz INSTEAD OF wyzwalacza nie jest wyzwalana, gdy nested triggers opcji konfiguracja serwera jest wyłączony.W SQL Server 2005 lub nowszej, pierwszy po wyzwalacza zagnieżdżone wewnątrz INSTEAD uruchamiany wyzwalacza nawet wtedy, gdy nested triggers opcji konfiguracja serwera jest zestaw na wartość 0.Jednakże w obszarze to ustawienie później po wyzwalacze nie uruchamiaj.Zaleca się przejrzenie aplikacji wyzwalaczy zagnieżdżonych ustalić, czy aplikacje nadal są zgodne z reguły biznesowe w odniesieniu do tego zachowania podczas nested triggers opcji konfiguracja serwera jest zestaw na 0, a następnie wprowadzić odpowiednie zmiany.
Odroczone rozpoznawanie nazw
SQL Serverpozwala na Transact-SQL procedur przechowywanych, wyzwalaczy i instancje do odwoływania się do tabel, które nie istnieją w czas kompilacji.Ta możliwość jest nazywane rozpoznawaniem nazw odroczonego.Jednakże jeśli Transact-SQL procedura składowana, wyzwalacza lub partia odwołuje się do tabela zdefiniowanej w procedura składowana lub wyzwalacza, jest wyświetlane ostrzeżenie w czas jego tworzenia tylko wtedy, gdy ustawienie poziom zgodności 65.Jest wyświetlane ostrzeżenie w czas kompilacji użycie partia .Zwracany jest komunikat o błędzie w działania czas po tabela , do którego odwołuje się nie istnieje.Aby uzyskać więcej informacji, zobacz Odroczone rozpoznawanie nazw i kompilacji.
Uprawnienia
Aby utworzyć DML wyzwalacza wymaga uprawnień ALTER na tabela lub widoku, na którym tworzony jest wyzwalacz.
Do tworzenia wyzwalacza DDL z serwera zakres (na wszystkich SERVER) lub logowania wyzwalacza wymaga uprawnień sterowania serwera na serwerze.Do tworzenia DDL wyzwalacz z bazy danych zakres (na bazie danych) wymaga uprawnień WYZWALACZA DDL ZMIEŃ DOWOLNE bazę danych w bieżącej bazie danych.
Przykłady
A.Wyzwalacz DML przy użyciu wiadomości przypomnienia
Następujące wyzwalacza DML drukuje wiadomość do klient , gdy ktoś próbuje dodać lub zmienić danych w Customer tabela.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL
DROP TRIGGER Sales.reminder1;
GO
CREATE TRIGGER reminder1
ON Sales.Customer
AFTER INSERT, UPDATE
AS RAISERROR ('Notify Customer Relations', 16, 10);
GO
B.Przypomnienie wiadomości e-mail przy użyciu wyzwalacza DML
Poniższy przykład wysyła wiadomość e-mail do określonej osoby (MaryM) po Customerzmianytabela .
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
DROP TRIGGER Sales.reminder2;
GO
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER INSERT, UPDATE, DELETE
AS
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'AdventureWorks2008R2 Administrator',
@recipients = 'danw@Adventure-Works.com',
@body = 'Don''t forget to print a report for the sales force.',
@subject = 'Reminder';
GO
C.Aby wymusić reguły biznesowej w tabelach dostawcy i PurchaseOrderHeader przy użyciu wyzwalacza po DML
Ponieważ ograniczeń typu CHECK można odwoływać się tylko kolumny, w których ograniczeniepoziom -poziom lub tabela- kolumnajest zdefiniowana, ograniczeniatabela krzyżowej-(w tym przypadek reguły biznesowe) musi być zdefiniowany jako wyzwalaczy.
Poniższy przykład tworzy wyzwalacza DML .Ten wyzwalacz sprawdza poziom kredytu dla dostawcy jest dobry, podczas próby wstawienia nowego zamówienia zakupu do PurchaseOrderHeader tabela.Aby otrzymać kredyt dostawcy, musi odwoływać sięVendortabela . Jeśli poziom kredytu jest zbyt niska, wyświetlany jest komunikat i wstawiania jest wykonać.
Ostrzeżenie
Aby wyświetlić przykłady wyzwalaczy po DML , które aktualizują wiele wierszy, zobacz MultiRow zagadnienia dotyczące DML wyzwalaczy.Aby wyświetlić przykłady DML zamiast WSTAWIANIA wyzwalaczy, zobacz ZAMIAST WSTAWIANIA wyzwalaczy.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID ('Purchasing.LowCredit','TR') IS NOT NULL
DROP TRIGGER Purchasing.LowCredit;
GO
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
DECLARE @creditrating tinyint, @vendorid int;
IF EXISTS (SELECT *
FROM Purchasing.PurchaseOrderHeader p
JOIN inserted AS i
ON p.PurchaseOrderID = i.PurchaseOrderID
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = p.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES(
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638);
GO
D.Przy użyciu wyzwalacza DDL zakresu bazy danych
W poniższym przykładzie użyto wyzwalacza DDL , aby zapobiec utracona wszelkie synonim w bazie danych.
USE AdventureWorks2008R2;
GO
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE;
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_SYNONYM
AS
RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)
ROLLBACK
GO
DROP TRIGGER safety
ON DATABASE;
GO
E.Przy użyciu wyzwalacza DDL zakresu serwera
W poniższym przykładzie użyto wyzwalacza DDL , aby wydrukować wiadomość, jeśli wszelkie bazy danych utworzyć zdarzenie występuje w przypadku serwera bieżące wystąpieniei korzysta z EVENTDATA funkcja pobrać tekstu odpowiednich Transact-SQL instrukcja.
Ostrzeżenie
Więcej przykładów, które używają EVENTDATA w Wyzwalacze DDL , zobacz Funkcja EVENTDATA.
IF EXISTS (SELECT * FROM sys.server_triggers
WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
PRINT 'Database Created.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
F.Przy użyciu wyzwalacza logowania
W poniższym przykładzie wyzwalacza logowania odrzuca próbę logowania do SQL Server jako element członkowski login_test logowania, jeśli istnieją już trzy sesji użytkowników uruchomionych w tym logowania.
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;
G.Wyświetlanie zdarzeń, które powodują uruchomienie wyzwalacza INSTEAD
W następujących przykładowych kwerendach sys.triggers i sys.trigger_events widoki wykazu , aby określić, które Transact-SQL zdarzenia języka spowodować wyzwalacza safety do ognia.safetyw poprzednim przykładzie zostanie utworzona.
SELECT TE.*
FROM sys.trigger_events AS TE
JOIN sys.triggers AS T
ON T.object_id = TE.object_id
WHERE T.parent_class = 0
AND T.name = 'safety'
GO
Zobacz także