Udostępnij za pośrednictwem


CREATE TRIGGER (języka Transact-SQL)

Tworzy DML, DDL lub wyzwalacza logowania.Wyzwalacz to specjalny rodzaj procedura przechowywana, która wykonuje automatycznie po wystąpieniu zdarzenie na serwerze bazy danych.Wyzwalacze DML wykonuje, jeśli użytkownik podejmie próbę zmodyfikowania danych przez zdarzenie typu danych manipulacji języka (DML).Zdarzenia DML są INSERT, UPDATE, lub DELETE instrukcji na tabela lub widoku.

Uwaga

Te wyzwalacze ognia podczas każde ważne zdarzenie uruchamiane, niezależnie od tego, niezależnie od tego, czy dotyczy wszystkich wierszy tabela.

Wyzwalacze DDL na wykonać w odpowiedzi na różne zdarzenia (DDL) języka definicja danych.Zdarzenia te odnoszą się głównie do Transact-SQL Instrukcje CREATE, ALTER i DROP i niektórych systemu przechowywane procedury, które wykonują operacje DDL podobne. Jest ustanawiane pożaru wyzwalacze logowania w odpowiedzi na zdarzenie logowanie, która powstaje, gdy w sesji użytkownika.Triggers can be created directly from Transact-SQL statements or from methods of assemblies that are created in the Microsoft .NET Framework common language runtime (CLR) and uploaded to an instance of SQL Server.SQL Server allows for creating multiple triggers for any specific statement.

Security noteSecurity Note:

Złośliwy kod wewnątrz Wyzwalacze mogą być uruchamiane escalated uprawnień.Aby uzyskać więcej informacji na temat chroni przed zagrożeniem zobacz Managing Trigger Security.

Topic link iconKonwencje składni języka Transact-SQL

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
    To nazwa schematu, do której należy dany wyzwalacz DML.DML triggers are scoped to the schema of the table or view on which they are created.schema_name cannot be specified for DDL or logon triggers.

  • trigger_name
    To nazwa wyzwalacza.A trigger_name muszą być zgodne z zasadami identyfikatory, z wyjątkiem tej trigger_name Nie można uruchomić z # lub ##.

  • table | view
    Jest to tabela lub widok, na którym jest wykonywane i jest czasami nazywane wyzwalaczem widoku tabeli lub wyzwalacza wyzwalaczy DML.Określanie w pełni kwalifikowaną nazwę tabela lub widoku jest opcjonalne.Widok można odwoływać się tylko przez wyzwalacz Z INSTEAD.Wyzwalacze DML nie mogą być definiowane w tabelach tymczasowych lokalnej lub globalnej.

  • BAZY DANYCH
    Stosuje się zakres wyzwalacz DLL do bieżącej bazy danych.Jeśli określono, przy każdym uruchomieniu wyzwalacza 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ślono, przy każdym uruchomieniu wyzwalacza event_type lub event_group występuje w dowolnym miejscu na bieżącym serwerze.

  • Z szyfrowanie
    Obfuscates tekst instrukcja CREATE TRIGGER.Za pomocą WITH szyfrowanie uniemożliwia publikowana jako część wyzwalacza SQL Server replikacja. Nie można określić WITH szyfrowanie wyzwalaczy środowiska CLR.

  • wykonać JAKO
    Określa kontekst zabezpieczeń, na których jest wykonywana wyzwalacza.Umożliwia sterowanie wystąpienie konta użytkownika, który z SQL Server używa do sprawdzania uprawnień do żadnych obiektów bazy danych, do których odwołuje się wyzwalacza.

    Aby uzyskać więcej informacji zobacz EXECUTE AS Clause (Transact-SQL).

  • DLA | PO
    Po Określa, że wyzwalacz DML jest uruchamiany tylko po wszystkie operacje określone w instrukcja języka SQL wyzwalającego została wykonana pomyślnie.Wszystkie akcje Kaskada więzów i ograniczenia kontroli również musi pomyślnie przed uruchomieniu tego wyzwalacza.

    Ustawieniem domyślnym jest po kiedy FOR jest tylko określone słowo kluczowe.

    Po wyzwalaczy nie mogą być definiowane w widokach.

  • ZAMIAST
    Określa, że wyzwalacz DML jest wykonywane zamiast wyzwalającego instrukcję SQL, dlatego przesłanianie akcje wyzwalającego instrukcja.INSTEAD OF nie mogą być określone dla wyzwalaczy DDL lub logowania.

    Co najwyżej jeden, a nie z wyzwalacza seryjnego na instrukcja INSERT, UPDATE lub DELETE mogą być definiowane w tabela lub widoku.Jednak istnieje możliwość zdefiniowania widoki na widokach, gdzie każdy widok ma swoją własną, a nie z wyzwalaczem.

    INSTEAD OF triggers are not allowed on updatable views that use WITH CHECK OPTION.SQL Server raises an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified.Użytkownik musi usunąć tę opcję przy użyciu instrukcji ALTER VIEW przed zdefiniowaniem wyzwalacza Z INSTEAD.

  • {[DELETE] [,] [WSTAW] [,] [AKTUALIZACJI]}
    Określa instrukcji modyfikacji danych, które Uaktywnij wyzwalacz DML, gdy zostanie podjęta próba go przed tej tabela lub widoku.Należy określić co najmniej jedną opcję.Dowolnej kombinacji tych opcji w dowolnej kolejności jest dozwolony w definicji wyzwalacza.

    Dla a nie z wyzwalaczy, opcja DELETE nie jest dozwolona na tabele z relacją więzów określanie akcja Kaskadowo, ON DELETE.Podobnie opcje aktualizacji nie jest dozwolona na tabele z relacją więzów Określanie jest akcja Kaskada ON UPDATE.

  • event_type
    Jest to nazwa Transact-SQL zdarzenie języka, który, po wykonaniu, powoduje uruchomienie wyzwalacz DLL. Ważne zdarzenia wyzwalaczy DDL są wymienione w DDL Events.

  • event_group
    Nazywa się grupą wstępnie zdefiniowanych Transact-SQL zdarzenia języka. wyzwalacz DLL uruchomieniu po wykonaniu wszelkich Transact-SQL zdarzenie języka, którego należy event_group. zdarzenie prawidłowej grupy wyzwalaczy DDL są wymienione na DDL Event Groups.

    Po zakończeniu pracy, działania WYZWALACZA CREATE event_group również pełnić rolę makra przez dodanie obejmuje on typy zdarzeń do widoku sys.trigger_events wykazu.

  • Z DOŁĄCZANIA
    Określa, że wyzwalacz dodatkowe istniejącego typu należy dodać.WITH APPEND nie można używać z a nie z wyzwalaczami lub, jeśli po wyraźnie określono wyzwalacza.WITH APPEND mogą być używane tylko wtedy, gdy do jest określona, bez Z INSTEAD lub po, ze względu na zgodność z poprzednimi wersjami.WITH APPEND nie można określić, jeśli nazwa EXTERNAL określono (Jeśli wyzwalacz jest wyzwalacz CLR).

    Important noteImportant Note:

    WITH APPEND will be removed in the next version of Microsoft SQL Server.Nie korzystać Z APPEND w nowej pracy rozwoju i chce zmodyfikować aplikacje, które aktualnie go używają.

  • NIE DO replikacja
    Wskazuje, że wyzwalacz nie powinna być uruchamiana, gdy agent replikacja modyfikuje tabela, która uczestniczy w wyzwalacza.Aby uzyskać więcej informacji zobaczKontrolowanie ograniczenia tożsamości i wyzwalaczy z nie dla replikacja.

  • sql_statement
    Jest to warunki wyzwalacza i akcje.Warunki wyzwalacza Określ dodatkowe kryteria, które określają, czy tried DML, DDL lub zdarzenia logowania powodują akcje wyzwalacza, należy wykonać.

    Akcje wyzwalacza, określone w Transact-SQL Instrukcje przechodzenia w życie operacji zostanie podjęta próba.

    Wyzwalacze mogą zawierać żadnych liczbę i rodzaj z Transact-SQL sprawozdanie z wyjątkami. Aby uzyskać więcej informacji zobacz Spostrzeżenia.Wyzwalacz został zaprojektowany, aby sprawdzić lub zmienić danych w oparciu o instrukcja modyfikacji lub definicji danych; nie powinien zwrócić dane do użytkownika.The Transact-SQL statements in a trigger frequently include język sterowania przepływem.

    Wyzwalacze DML użyć wstawione i usunięte tabel (Ogólne) logicznego.Są one strukturalnie podobna do tabela zdefiniowano wyzwalacz, oznacza to, w tabela, na którym zostanie podjęta próba akcja użytkownika.Tabele wstawione i usunięte przechowywania wartości stare lub nowe wartości wierszy, które mogą być zmieniane przez akcja użytkownika.Na przykład, aby pobrać wszystkie wartości deleted Tabela wykorzystania:

    SELECT *
    FROM deleted
    

    Aby uzyskać więcej informacji zobacz Using the inserted and deleted Tables.

    DDL i logowania wyzwalacze przechwytywania informacji dotyczących zdarzenie wyzwalającego przy użyciu EVENTDATA (Transact-SQL) Funkcja. Aby uzyskać więcej informacji zobaczUsing the EVENTDATA Function.

    SQL Server zezwala na aktualizację text, ntext, lub image kolumny do wyzwalacza Z INSTEAD w tabelach lub widokach.

    Important noteImportant Note:

    ntext, text, and image data types will be removed in a future version of Microsoft SQL Server.Należy unikać stosowania tych typów danych w nowej pracy rozwoju i zaplanować do modyfikowania aplikacji, które aktualnie używają ich.Użycie nvarchar(max), varchar(max), and varbinary(max) zamiast niego.Po i INSTEAD OF wyzwala pomocy technicznej varchar(MAX), nvarchar(MAX), a varbinary(MAX) dane w tabelach wstawione i usunięte.

  • < method_specifier >
    Środowisko CLR wyzwalaczy określa metoda wirtualny plik dziennika do powiązania z wyzwalaczem.The method must take no arguments and return void.class_name must be a valid SQL Server identifier and must exist as a class in the assembly with assembly visibility.Jeśli klasa ma obszar nazw kwalifikowaną nazwę tego zastosowania. "do oddzielania części obszaru nazw, nazwa klasy musi być rozdzielany za pomocą [] lub „" ograniczników.Klasa nie może być zagnieżdżone klasy.

    Uwaga

    Domyślnie, zdolność SQL Server uruchomienie kodu CLR jest wyłączone. Można tworzyć, modyfikować i upuszczać obiekty bazy danych, które odwołują się do modułów kod zarządzany, ale te odwołania nie będzie wykonywał w wystąpieniu SQL Server chyba że CLR włączona opcja za pomocą jest włączonasp_configure.

Remarks

Wyzwalacze DML

DML triggers are frequently used for enforcing business rules and data integrity.SQL Server provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements.Funkcja DRI nie zapewnia bazy danych między więzów integralność.Więzy integralność odnosi się do reguł o relacjach między kluczy podstawowych i obcych z tabel.Aby wymusić więzów integralność, należy użyć ograniczenia klucz podstawowy i klucz obcy w instrukcji ALTER tabela i CREATE tabela.Jeśli w tabela wyzwalacz istnieją ograniczenia, są one sprawdzane po wykonaniu wyzwalacza Z INSTEAD i przed wykonaniem wyzwalacza po.Jeśli ograniczenia są naruszane, akcje wyzwalacza Z INSTEAD są przywracane, a wyzwalacz po nie jest uruchamiany.

Pierwszy i ostatni po wyzwalaczy, które mają być wykonane na tabela można określić przy użyciu sp_settriggerorder.Tylko jeden pierwszej i jedno ostatni później wyzwalacza dla każdego INSERT, UPDATE, a operacja DELETE można określić w tabela.W przypadku innych wyzwalacze po na tej samej tabela, są one losowo wykonywane.

Jeśli instrukcja ALTER TRIGGER ulegnie zmianie pierwszy lub ostatni wyzwalacz, pierwszy lub ostatni atrybut ten jest ustawiony na zmodyfikowanego wyzwalacza zostanie usunięte, a wartość zamówienia musi być zresetowane przy użyciu sp_settriggerorder.

Wyzwalacz po jest wykonywane tylko wtedy, gdy wyzwalającego instrukcja języka SQL została wykonana pomyślnie.To pomyślne wykonanie zawiera wszystkie akcje Kaskada więzów i ograniczenia kontroli skojarzone z obiektem zaktualizowany lub usunięty.

Jeśli wyzwalacz Z INSTEAD zdefiniowane w tabela jest wykonywana instrukcja przed tabela, która będzie zazwyczaj ognia ponownie wyzwalacza Z INSTEAD, wyzwalacz nie jest wywoływana cyklicznie.Zamiast tego w instrukcja są przetwarzane tak, jakby w tabela nie miał a nie z wyzwalacz i łańcuch ograniczenie działań i później wykonań wyzwalacz jest uruchamiany.Na przykład jeśli wyzwalacz jest zdefiniowany jako wyzwalacz INSERT INSTEAD Z tabela wyzwalacz wykonuje instrukcję SQL INSERT na tej samej tabela, wykonywane przez wyzwalacz Z INSTEAD instrukcja INSERT nie będzie wywoływał wyzwalacz ponownie.Wykonane przez wyzwalacz INSERT rozpoczyna się proces wykonywania czynności, ograniczenia i wyzwalania wyzwalacze później INSERT zdefiniowanych dla tabela.

Jeśli wyzwalacz Z INSTEAD zdefiniowane w widoku jest wykonywana instrukcja wobec widoku, który będzie zazwyczaj ognia ponownie wyzwalacza Z INSTEAD, nie jest on nazywany cyklicznie.Zamiast tego w instrukcja jest rozwiązywana postać modyfikacji dla podstawowych tabel, będących podstawą widoku.W takim przypadek definicja widoku musi spełniać wszystkie ograniczenia dla widoku programu mogą być aktualizowane.Aby uzyskać definicję widoki mogą być aktualizowane zobacz Modifying Data Through a View.

Na przykład jeśli wyzwalacz jest zdefiniowany jako wyzwalacz Z INSTEAD UPDATE dla widoku wyzwalacza wykonuje instrukcję UPDATE odwoływania się do tego samego widoku, instrukcja UPDATE, wykonywane przez wyzwalacz Z INSTEAD nie wywołuje wyzwalacz ponownie.Aktualizacja wykonywane przez wyzwalacz jest przetwarzany przed widok tak, jakby widoku nie ma wyzwalacz Z INSTEAD.W kolumnach zmienione przez AKTUALIZACJĘ muszą być rozwiązane do pojedynczej tabela bazowa.Każda modyfikacja nazwę tabela bazowa podstawowej uruchamia łańcucha stosowanie ograniczeń i wyzwalania później Wyzwalacze dla tabeli.

Testowanie UPDATE lub INSERT akcje do określonych kolumn

Można zaprojektować Transact-SQL wyzwalacz do wykonywania pewnych działań oparte na modyfikacjach UPDATE lub INSERT określonych kolumn. Użycie UPDATE() or COLUMNS_UPDATED w treści wyzwalacza do tego celu.UPDATE() testów dla UPDATE lub INSERT stara się o jedną kolumna.COLUMNS_UPDATED testy dla akcji UPDATE lub INSERT, które są wykonywane na wiele kolumn i zwraca wzorzec bitowy wskazujący kolumny, które zostały wstawione lub zaktualizowane.

Ograniczenia wyzwalacza

CREATE TRIGGER musi być pierwszym instrukcja w partia i może dotyczyć tylko jedną tabela.

Wyzwalacz zostanie utworzony tylko w bieżącej bazie danych; jednak wyzwalacz może odwoływać się obiekty poza bieżącą bazę danych.

Jeżeli określono nazwę schematu wyzwalacz do kwalifikowania wyzwalacz, kwalifikowanie nazwę tabela w taki sam sposób.

Więcej niż jednego akcja użytkownika (na przykład, INSERT i UPDATE) w tej samej instrukcja CREATE TRIGGER można określić tę samą akcja wyzwalacza.

INSTEAD OF DELETE/UPDATE wyzwalaczy nie mogą być definiowane w tabela zawierającej klucz obcy z kaskadę na określonych akcja DELETE/UPDATE.

Wewnątrz wyzwalacza można określać żadnych instrukcja zestaw.zestaw opcji obowiązuje podczas wykonywania wyzwalacza, a następnie powróci do jego poprzedniego ustawienia.

Po uruchomieniu wyzwalacza, wyniki są zwracane do aplikacji wywołującej, podobnie jak z procedur przechowywanych.Aby zapobiec temu wyników zwróconych do aplikacji z powodu wypalania wyzwalacz, nie należy umieszczać instrukcji SELECT, które zwracają wyniki albo instrukcji, które wykonują przypisania zmiennej w wyzwalacza.Wyzwalacz, który zawiera instrukcji SELECT, które zwracają wyniki dla użytkownika lub instrukcji, które wykonują przypisania zmiennej wymaga specjalnej obsługi, zwracane wyniki będą musiały do każdej aplikacji, w którym są dozwolone zmiany do tabela wyzwalacz.Jeśli zmienna przypisania musi występować w wyzwalacz, użyj instrukcję zestaw NOCOUNT na początku wyzwalacz, aby uniemożliwić zwrotu wszystkie zestawy wyników.

Mimo, że instrukcja OBCINANIA tabela obowiązuje instrukcji DELETE, nie aktywuje wyzwalacza, ponieważ operacja nie rejestruje usuwanie pojedynczych wierszy.Jednak tylko użytkownicy z uprawnieniami do wykonywania instrukcja OBCINANIA tabela potrzeby obawy przypadkowo obejścia wyzwalacza DELETE w ten sposób.

Instrukcja WRITETEXT zarejestrowane lub niezarejestrowanych, nie aktywuje wyzwalacza.

Poniżej Transact-SQL deklaracje nie są dozwolone w wyzwalacz DML:

ZMIENIANIE BAZY DANYCH

TWORZENIE BAZY DANYCH

USUWANIE BAZY DANYCH

OBCIĄŻENIE BAZY DANYCH

DZIENNIK ŁADOWANIA

ZMIEŃ KONFIGURACJĘ

PRZYWRACANIE BAZY DANYCH

przywracanie DZIENNIK

 

Ponadto następujące Transact-SQL instrukcje nie są dozwolone wewnątrz treści wyzwalacz DML, gdy jest używany dla tabela lub widoku, który jest celem wyzwalającego akcja.

CREATE INDEX (w tym CREATE INDEX PRZESTRZENNEJ i CREATE XML INDEX)

ALTER INDEX

USUWANIE INDEKSU

DBCC DBREINDEX

ALTER PARTITION FUNCTION

USUNĄĆ tabela

ALTER tabela do, wykonaj następujące czynności:

  • Dodawanie, modyfikowanie lub usuwanie kolumn.

  • Przełącz partycji.

  • Dodawanie lub usuwanie klucz podstawowy lub UNIQUE ograniczeń.

 

 

Uwaga

Ponieważ SQL Server nie jest obsługiwana przez użytkownika wyzwalaczy w tabelach systemowych, firma Microsoft zaleca, że wyzwalacze zdefiniowanej przez użytkownika nie należy tworzyć na tabelach systemowych.

Wyzwalacze kod DDL

Wyzwalacze DDL, wyzwalacze standardowych, takich jak wykonać procedur przechowywanych w odpowiedzi na zdarzenie.Jednak w przeciwieństwie do standardowych wyzwalacze nie one wykonać w odpowiedzi UPDATE, INSERT lub DELETE instrukcji na tabela lub widoku.Zamiast tego one przede wszystkim wykonać w odpowiedzi na instrukcje języka (DDL) definicja danych.Obejmują one instrukcje CREATE, ALTER, DROP, GRANT, DENY, REVOKE i aktualizacja statystyki.Niektóre procedury składowane w systemie, wykonujących operacje DDL podobne może również wystrzelić wyzwalacze DDL.

Important noteImportant Note:

Przetestuj swoją wyzwalacze DDL do ustalenia ich reakcji na wykonanie systemowa procedura składowana.Na przykład, instrukcja CREATE TYPE i sp_addtype i sp_rename procedur przechowywanych spowoduje uruchomienie wyzwalacz DLL, który jest tworzony zdarzenie CREATE_TYPE.

Aby uzyskać więcej informacji na temat języka DDL wyzwalaczy zobacz DDL Triggers.

Wyzwalacze DDL nie ognia w reakcji na zdarzenia, które wpływają na tabelach tymczasowych lokalnej lub globalnej i procedur przechowywanych.

W odróżnieniu od DML wyzwalacze, Usługa wyzwalaczy DDL nie są objęty zakresem do schematów.W związku z tym nie można użyć funkcji, takich jak OBJECT_ID OBJECT_NAME, OBJECTPROPERTY i OBJECTPROPERTYEX dla kwerendy metadane dotyczące wyzwalaczy DDL.W zamian za pomocą widoki wykazu.Aby uzyskać więcej informacji zobaczGetting Information About DDL Triggers.

Uwaga

Serwer o zakresie wyzwalacze DDL są wyświetlane w SQL Server Management Studio Object Explorer w Wyzwalacze folder. Ten folder znajduje się w obszarze Obiekty serwera folder. Baza danych o zakresie wyzwalaczy DDL są wyświetlane w Wyzwalacze bazy danych folder. Ten folder znajduje się w obszarze Programowania folder z odpowiednią bazę danych.

Wyzwalacze logowania

Wyzwalacze logowania wykonać procedur przechowywanych w odpowiedzi na zdarzenie logowanie.To zdarzenie jest wywoływane, gdy sesja użytkownika jest ustanawiana z wystąpienie SQL Server. Wyzwalacze logowania ognia po rejestrowanie zakończeniu fazy uwierzytelnianie, ale zanim użytkownik faktycznie jest ustanawiana sesja.Dlatego też wszystkich wiadomości pochodzących z wewnątrz wyzwalacz, który zazwyczaj docierają użytkownika, takie jak komunikaty o błędach i komunikaty z instrukcja PRINT są kierowane do SQL Server Dziennik błędów. Aby uzyskać więcej informacji zobacz Wyzwalacze logowania.

Wyzwalacze logowania nie wyzwalana, jeśli uwierzytelnianie nie powiedzie się.

Transakcji rozproszonych nie są obsługiwane w wyzwalacz logowania.Jeśli wyzwalacz logowania, zawierające transakcja rozproszona jest uruchamiany, zwracany jest błąd 3969.

Ogólne wskazówki dotyczące wyzwalaczy

Zwracanie wyniki

Możliwość zwrócić wyniki z wyzwalacze zostaną usunięte w przyszłej wersja programu 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.Uniknąć przesłać zestaw wyników z wyzwalaczy w nowej pracy rozwoju i zaplanować do modyfikowania aplikacji, które aktualnie to zrobić.Aby uniemożliwić wyzwalacze zwraca zestaw wyników, należy ustawić Nie zezwalaj na wyniki z opcją wyzwalaczy to 1.

Wyzwalacze logowania nie zawsze Zezwalaj zestawów wyniki mają być zwrócone, a to zachowanie nie jest konfigurowany.Wyzwalacz logowania będzie generował zestaw wyników, wyzwalacz nie można wykonać, a próba logowania, który uruchamiany wyzwalacz jest zabroniony.

Wiele wyzwalaczy

SQL Server zezwala na wiele wyzwalaczy ma być utworzony dla każdego zdarzenie DML, DDL lub logowanie.Na przykład jeśli CREATE TRIGGER FOR UPDATE jest wykonywana dla tabela, która już ma wyzwalacz UPDATE, jest tworzony wyzwalacz dodatkowa aktualizacja.We wcześniejszych wersjach SQL Server, tylko jeden wyzwalacz dla każdego INSERT, UPDATE lub DELETE zdarzenie modyfikacji danych jest dozwolony dla każdej tabela.

Wyzwalacze cykliczne

SQL Server Umożliwia również wywołania cyklicznej wyzwalaczy, gdy włączone jest ustawienie RECURSIVE_TRIGGERS, za pomocą instrukcji ALTER DATABASE.

Wyzwalacze cykliczne włączyć następujące rodzaje rekursji:

  • Pośrednie rekurencji

    Z pośrednich rekursji aplikacji aktualizuje tabela T1.Ten uruchamiany wyzwalacz TR1, aktualizacja tabela T2.W takim przypadku wyzwolenia T2, a następnie uruchamiany, a aktualizacje tabela T1.

  • Bezpośrednie rekurencji

    Z bezpośredniego rekursji aktualizacji aplikacji tabela T1.Ten uruchamiany wyzwalacz TR1, aktualizacja tabela T1.Ponieważ tabela T1 został zaktualizowany, należy wywołać TR1 uruchamiany ponownie, i tak dalej.

W poniższym przykładzie użyto zarówno bezpośrednie i pośrednie wyzwalacza rekursji Przyjmij, że dwa wyzwalaczy aktualizacji, TR1 i TR2, są zdefiniowane w tabela T1.Wyzwalacz TR1 aktualizacje tabela T1 cyklicznie.Instrukcja UPDATE wykonuje każdego TR1 i TR2 jeden raz.Ponadto wykonanie TR1 wyzwala wykonanie TR1 (rekursywnie) i TR2.Tabele wstawione oraz usunięte dla określonego wyzwalacza zawierają wiersze, które odnoszą się tylko do instrukcja UPDATE, która wywołała wyzwalacza.

Uwaga

Poprzednie zachowanie występuje tylko wtedy, gdy jest włączone ustawienie RECURSIVE_TRIGGERS, za pomocą instrukcji ALTER DATABASE.Brak nie zdefiniowanej kolejności wykonywania wiele wyzwalaczy zdefiniowany dla określonego zdarzenie.Każdy wyzwalacz powinien być niezależnym.

Tylko wyłączenie ustawienia RECURSIVE_TRIGGERS uniemożliwia bezpośrednią recursions.Aby wyłączyć rekursję pośrednich również, ustawić zagnieżdżonych wyzwalaczy opcji serwera 0 przy użyciu sp_configure.

Jeśli jeden z wyzwalacze przeprowadza TRANSAKCJĘ ROLLBACK, niezależnie od poziom zagnieżdżenia nie więcej wyzwalaczy są wykonywane.

Zagnieżdżone wyzwalaczy

Wyzwalacze można zagnieździć maksymalnie 32 poziomy.Jeśli wyzwalacz zmienia tabela, na którym jest inny wyzwalacz, drugi wyzwalacz jest aktywny i może następnie wywołania wyzwalacza trzeci itd.Każdy wyzwalacz w łańcuchu ustawia nieskończoną pętlę, poziom zagnieżdżenia zostanie przekroczony, a wyzwalacz został anulowany.Gdy Transact-SQL wyzwalacz jest wykonywany kod zarządzany przy odwoływaniu się do rutynowych CLR typu, lub agregacja, to odwołanie jest liczone jako jeden poziom w ograniczeniu 32 poziomu zagnieżdżenia. Metody wywoływane z kodem zarządzanym nie są uwzględniane przez ten limit

Wyłączenie zagnieżdżonych wyzwalaczy zestaw opcji zagnieżdżonych wyzwalacze sp_configure do 0 (wyłączona).Domyślna konfiguracja umożliwia zagnieżdżonych wyzwalaczy.Jeżeli zagnieżdżonych wyzwalaczy jest wyłączona, wyzwalacze cyklicznej także jest wyłączona, niezależnie od RECURSIVE_TRIGGERS zestaw ting zestaw przy użyciu instrukcji ALTER DATABASE.

Uwaga

W SQL Server 2000, każdy wyzwalacz po zagnieżdżone OF an INSTEAD wyzwalacz nie wyzwalana po nested triggers Opcja Konfiguracja serwera jest wyłączona. W SQL Server 2005 lub nowszy przy pierwszym po wyzwalacza zagnieżdżone INSTEAD Z uruchamiany wyzwalacz, nawet jeśli nested triggers Opcja Konfiguracja serwera jest zestaw na 0. Jednak w tym ustawienia później po wyzwalacze nie pożaru.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 Opcja konfiguracja serwera jest ustawiona na wartość 0, a następnie wprowadź odpowiednie modyfikacje.

Ponadto wykonywanie instrukcji ALTER tabela niepowodzenie instrukcji na tabele uczestniczące w widokach, które mają wiązanie schematu, gdy instrukcje te mają wpływ na definicję widoku.

SQL Server pozwala na Transact-SQL procedur przechowywanych, wyzwalaczy i instancje do odwoływania się do tabel, które nie istnieją czas kompilacji. Ta możliwość jest nazywane rozpoznawaniem nazw odłożone.Jednak jeśli Transact-SQL procedura przechowywana, wyzwalacza lub wsadowym odnosi się do tabela, która jest zdefiniowana w procedurze przechowywanej lub wyzwalacza, wydano komunikat ostrzegawczy przy tworzeniu czas tylko wtedy, gdy ustawienie poziom zgodności 65. czas kompilacji wygenerowane ostrzeżenie, jeśli zadanie partia jest używane.W czasie wykonywania, gdy nie tabela, do którego odwołuje się zwracany jest komunikat o błędzie.Aby uzyskać więcej informacji zobaczDeferred Name Resolution and Compilation.

Uprawnienia

Do tworzenia wyzwalacz DML wymaga uprawnienia ALTER na tabela lub widok, w którym utworzono wyzwalacza.

Aby utworzyć wyzwalacz DLL z zakres serwera (ON ALL SERVER) lub logowania wyzwalacza wymaga uprawnienia kontroli SERVER na serwerze.Do tworzenia DDL wyzwalacz z zakres bazy danych (ON DATABASE) wymaga uprawnienia ALTER bez TRIGGER DDL bazy danych w bieżącej bazie danych.

Przykłady

A.Za pomocą wyzwalacz DML komunikatem przypomnienia

Następujące wyzwalacz DML drukuje wiadomość do klient, gdy każdy użytkownik próbuje dodać lub zmienić danych w Customer Tabela.

B.Przy użyciu wyzwalacz DML z wiadomości e-mail do monitu

W poniższym przykładzie wysyła wiadomości e-mail (określonej osobyMaryM), gdy Customer zmiany w tabela.

C.Za pomocą wyzwalacza DML później do wymuszania reguł biznesowych między tabelami PurchaseOrderHeader i dostawcy

Ponieważ ograniczeń CHECK może odwoływać się tylko kolumna, które zdefiniowano ograniczenie poziomie kolumna lub tabela poziom, wszelkie ograniczenia tabela (w tym wypadku reguły biznesowe) musi być zdefiniowany jako wyzwalaczy.

Poniższy przykład tworzy wyzwalacz DML.Ten wyzwalacz sprawdza, czy poziom kredytu dla dostawcy jest dobry, podczas próby wstawienia nowego zamówienia zakupu do PurchaseOrderHeader Tabela. Aby uzyskać poziom kredytu dostawcy, Vendor musi być odwołuje się do tabela. Jeśli poziom kredytu jest zbyt niska, wyświetlany jest komunikat, a nie wykonuje wstawiania.

D.Za pomocą rozpoznawania nazw odroczenia

Poniższy przykład tworzy dwa wyzwalacze DML do zilustrowania odroczone nazw.

E.Za pomocą wyzwalacz DLL o zakresie bazy danych

W poniższym przykładzie użyto wyzwalacz DLL, aby zapobiec wszelkie synonim w bazie danych są opuszczane.

F.Za pomocą wyzwalacz DLL o zakresie serwera

W poniższym przykładzie użyto wyzwalacz DLL na drukowanie wiadomości, jeśli wszystkie zdarzenie tworzenie bazy danych jest wykonywane na bieżące wystąpienie serwera i używa EVENTDATA Funkcja pobrać odpowiedni tekst Transact-SQL Instrukcja.

Uwaga

Aby uzyskać więcej przykładów użycia EVENTDATA w DDL wyzwalaczy zobacz Using the EVENTDATA Function.

G.Za pomocą wyzwalacza logowania

W poniższym przykładzie wyzwalacza logowania odrzuca próbę logowania się do programu SQL Server jako element członkowski członkowski login_test logowanie, jeśli istnieją już trzy sesje użytkowników, działająca w ramach tego logowania.

H.Wyświetlanie zdarzeń, które powodują uruchomienie wyzwalacza

The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQL language events cause trigger safety to fire.safety is created in the previous example.

Historia zmian

Microsoft Learning

Dodać notatki w sekcji „ zagnieżdżony wyzwalaczy"w uwagach opisujących zachowania zmiany wprowadzone w SQL Server 2005 gdy później wyzwalacze są zagnieżdżone wewnątrz wyzwalacz Z INSTEAD.

Dodano informacje w sekcji "Logowanie wyzwalaczy" wskazujący, że te wyzwalacze nie obsługują transakcje rozproszone.

Usunięto nieprawidłowe instrukcja, że procedura przechowywana sp_rename nie wyzwalana, wszystkie wyzwalacze DDL.

See Also

Reference

Other Resources