Udostępnij za pomocą


ALTER TRIGGER (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w usłudze Microsoft Fabric

Modyfikuje definicję wyzwalacza DML, DDL lub logowania, który wcześniej został utworzony przez polecenie CREATE TRIGGER. Wyzwalacze są tworzone za pomocą CREATE TRIGGER. Mogą być tworzone bezpośrednio z Transact-SQL instrukcji lub z metod asemblów tworzonych w środowisku uruchomieniowym Microsoft .NET Framework (CLR) i przesyłanych do instancji SQL Server. Aby uzyskać więcej informacji o parametrach używanych w instrukcji ALTER TRIGGER, zobacz CREATE TRIGGER (Transact-SQL).

Transact-SQL konwencje składni

Składnia

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table | view )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
[ 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 an INSERT, UPDATE, or DELETE statement to a table 
-- (DML Trigger on memory-optimized tables)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table  )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
AS { sql_statement [ ; ] [ ...n ] }   
  
<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ <EXECUTE AS Clause> ]  
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, 
-- or UPDATE statement (DDL Trigger)  
  
ALTER TRIGGER trigger_name   
ON { DATABASE | ALL SERVER }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement [ ; ] | 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)  

ALTER 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  
-- Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)   
  
ALTER TRIGGER schema_name. trigger_name   
ON (table | view )   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
AS { sql_statement [ ; ] [...n ] }   
  
<dml_trigger_option> ::=   
    [ <EXECUTE AS Clause> ]   
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)   
  
ALTER TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=   
    [ <EXECUTE AS Clause> ]  

Arguments

schema_name
To nazwa schematu, do którego należy wyzwalacz DML. Wyzwalacze DML są przypisane do schematu tabeli lub widoku, na którym są tworzone. schema*_name* jest opcjonalne tylko wtedy, gdy wyzwalacz DML oraz odpowiadająca mu tabela lub widok należą do domyślnego schematu. schema_name nie można określić dla wyzwalaczy DDL ani logowania.

trigger_name
Czy to istniejący wyzwalacz do modyfikacji?

stół | widok
Jest tabelą lub widokiem, na którym uruchamiany jest wyzwalacz DML. Wskazanie w pełni kwalifikowanej nazwy tabeli lub widoku jest opcjonalne.

DATABASE
Stosuje zakres wyzwalacza DDL do bieżącej bazy danych. Jeśli zostanie określony, wyzwalacz jest uruchamiany zawsze, gdy event_type lub event_group występuje w bieżącej bazie danych.

WSZYSTKIE SERWERY
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Stosuje zakres wyzwalacza DDL lub logowania do bieżącego serwera. Jeśli zostanie określony, wyzwalacz jest uruchamiany zawsze, gdy event_type lub event_group występuje w dowolnym miejscu na bieżącym serwerze.

Z SZYFROWANIEM
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Szyfruje wpisy sys.syscommentssys.sql_modules zawierające tekst instrukcji ALTER TRIGGER. Użycie WITH ENCRYPTION zapobiega publikacji wyzwalacza jako części replikacji SQL Server. WITH ENCRYPTION nie może być określone dla wyzwalaczy CLR.

Uwaga / Notatka

Jeśli wyzwalacz zostanie utworzony przez użycie Z SZYFROWANIEM, musi być ponownie określony w instrukcji ALTER TRIGGER, aby ta opcja pozostała włączona.

WYKONAJ JAKO
Określa kontekst zabezpieczeń, w którym jest wykonywany wyzwalacz. Umożliwia kontrolę nad kontem użytkownika, którego instancja SQL Server używa do weryfikacji uprawnień do obiektów bazy danych odwołanych przez wyzwalacz.

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

NATIVE_COMPILATION
Wskazuje, że wyzwalacz jest natywnie skompilowany.

Ta opcja jest wymagana w przypadku wyzwalaczy w tabelach zoptymalizowanych pod kątem pamięci.

POWIĄZANIE SCHEMATU
Zapewnia, że tabele odwołane przez wyzwalacz nie mogą zostać usunięte ani zmienione.

Ta opcja jest wymagana dla wyzwalaczy w tablicach zoptymalizowanych pod pamięć i nie jest obsługiwana dla wyzwalaczy w tradycyjnych tabelach.

PO
Określa, że wyzwalacz jest uruchamiany dopiero po pomyślnym wykonaniu instrukcji SQL wyzwalającej. Wszystkie akcje kaskady referencyjnej i kontrole ograniczeń również musiały być pomyślne przed uruchomieniem tego wyzwalacza.

AFTER jest domyślnym, jeśli podano tylko słowo kluczowe FOR.

Wyzwalacze DML AFTER mogą być definiowane tylko w tabelach.

ZAMIAST
Określa, że wyzwalacz DML jest wykonywany zamiast wyzwalającego polecenia SQL, tym samym nadpisując działania wyzwalających instrukcji. INSTEAD OF nie może być określony dla wyzwalaczy DDL ani logowania.

W najwyższym wypadku można zdefiniować jeden wyzwalacz INSTEAD OF na każde polecenie INSERT, UPDATE lub DELETE w tabeli lub widoku. Możesz jednak zdefiniować widoki w widokach, gdzie każdy widok ma własny trigger ZAMIAST NIE.

Wyzwalacze INSTEAD OF nie są dozwolone w widokach utworzonych za pomocą opcji WITH CHECK OPTION. SQL Server wyświetla błąd, gdy do widoku, dla którego określono opcję WITH CHECK, dodano wyzwalacz ZAMIAST OF. Użytkownik musi usunąć tę opcję za pomocą ALTER VIEW przed zdefiniowaniem wyzwalacza INSTEAD OF.

{ [ USUŃ ] [ , ] [ WSTAW ] [ , ] [ AKTUALIZACJA ] } | { [WSTAW] [ , ] [AKTUALIZACJA] }
Określa instrukcje modyfikacji danych, gdy zostaną użyte przeciwko tej tabeli lub widokowi, aktywują wyzwalacz DML. Należy określić co najmniej jedną opcję. W definicji wyzwalacza dopuszczalna jest dowolna kombinacja tych elementów w dowolnej kolejności. Jeśli podano więcej niż jedną opcję, oddziel je przecinkami.

Dla wyzwalaczy INSTEAD OF opcja DELETE nie jest dozwolona w tabelach, które mają relację referencyjną określającą akcję kaskadową PRZY DELETE. Podobnie opcja AKTUALIZACJA nie jest dozwolona w tabelach, które mają relację referencyjną określającą akcję kaskadową PRZY AKTUALIZACJI. Aby uzyskać więcej informacji, zobacz ALTER TABLE (Transact-SQL).

event_type
To nazwa zdarzenia Transact-SQL języka, które po wykonaniu powoduje uruchomienie wyzwalacza DDL. Prawidłowe zdarzenia dla wyzwalaczy DDL są wymienione w zdarzeniach DDL.

event_group
To nazwa zdefiniowanej grupy zdarzeń Transact-SQL językowych. Wyzwalacz DDL uruchamia się po wykonaniu dowolnego zdarzenia Transact-SQL językowego należącego do event_group. Prawidłowe grupy zdarzeń dla wyzwalaczy DDL są wymienione w grupach zdarzeń DDL. Po zakończeniu działania ALTER TRIGGER działa event_group również jako makro, dodając typy zdarzeń, które obejmuje, do widoku katalogu sys.trigger_events.

NIE DOTYCZY REPLIKACJI
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Wskazuje, że wyzwalacz nie powinien być wykonywany, gdy agent replikacyjny modyfikuje tabelę zaangażowaną w wyzwalacz.

sql_statement
To warunki i działania wyzwalające.

Dla wyzwalaczy w tabelach zoptymalizowanych pamięcią jedynym sql_statement dozwolonym na najwyższym poziomie jest blok ATOMIC. T-SQL dozwolony wewnątrz bloku ATOMIC jest ograniczony przez T-SQL dozwolony w natywnych procedurach.

NAZWA ZEWNĘTRZNA <method_specifier>
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Określa metodę powiązania zespołu z wyzwalaczem. Metoda nie może przyjmować żadnych argumentów i zwracać wartość void. class_name musi być prawidłowym identyfikatorem programu SQL Server i musi istnieć jako klasa w zestawie z widocznością zestawu. Klasa nie może być klasą zagnieżdżoną.

Uwagi

Więcej informacji o ALTER TRIGGER można znaleźć w Uwagi w CREATE TRIGGER (Transact-SQL).

Uwaga / Notatka

Opcje EXTERNAL_NAME i ON_ALL_SERVER nie są dostępne w zamkniętej bazie danych.

Wyzwalacze DML

ALTER TRIGGER obsługuje ręcznie aktualizowane widoki poprzez wyzwalacze INSTEAD OF na tabelach i widokach. SQL Server stosuje ALTER TRIGGER w ten sam sposób dla wszelkiego rodzaju wyzwalaczy (AFTER, INSTEAD-OF).

Pierwszy i ostatni wyzwalacz AFTER do wykonania na tabeli można określić, używając sp_settriggerorder. W tabeli można określić tylko jeden wyzwalacz "first first" i jeden ostatni AFTER. Jeśli na tej samej tabeli są inne wyzwalacze AFTER, są one wykonywane losowo.

Jeśli polecenie ALTER TRIGGER zmienia pierwszy lub ostatni wyzwalacz, pierwszy lub ostatni zestaw atrybutów na zmodyfikowanym wyzwalaczu zostaje usunięty, a wartość zamówienia musi zostać zresetowana za pomocą sp_settriggerorder.

Wyzwalacz AFTER jest wykonywany dopiero po pomyślnym wykonaniu wyzwalającego polecenia SQL. To pomyślne wykonanie obejmuje wszystkie akcje kaskadowe odwołań i kontrole ograniczeń skojarzone z obiektem zaktualizowanym lub usuniętym. Operacja AFTER (wyzwalacz) sprawdza skutki instrukcji wyzwalającej, a także wszystkie kaskadowe akcje UPDATE i DELETE wywołane przez to zdanie.

Gdy akcja DELETE do tabeli dziecka lub odniesienia jest wynikiem CASCADE na DELETE z tabeli nadrzędnej, a na tej tablicy potomnej zdefiniowany jest wyzwalacz INSTEAD OF na DELETE, wyzwalacz jest ignorowany i akcja DELETE jest wykonywana.

Wyzwalacze DDL

W przeciwieństwie do wyzwalaczy DML, wyzwalacze DDL nie są dostosowane do schematów. Dlatego OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY oraz OBJECTPROPERTY(EX) nie mogą być używane podczas zapytań o metadane dotyczące wyzwalaczy DDL. Zamiast tego użyj widoków wykazu. Aby uzyskać więcej informacji, zobacz Uzyskiwanie informacji o wyzwalaczach DDL.

Wyzwalacze logowania

Azure SQL Database nie obsługuje wyzwalaczy przy zdarzeniach logowania.

Permissions

Aby zmienić wyzwalacz DML, potrzebne jest pozwolenie ALTER na tabelę lub widok, na którym wyzwalacz jest zdefiniowany.

Aby zmienić wyzwalacz DDL zdefiniowany w zakresie serwera (NA WSZYSTKICH SERWERACH) lub wyzwalacz logowania, wymagane jest uprawnienia CONTROL SERVER na serwerze. Aby zmienić wyzwalacz DDL zdefiniowanego z zakresem bazy danych (ON DATABASE), wymagane jest ZMODYFIKOWANIE DOWOLNEGO WYZWALACZA DDL w bazie danych w aktualnej bazie danych.

Przykłady

Poniższy przykład tworzy wyzwalacz DML w bazie AdventureWorks2025 danych, który drukuje zdefiniowany przez użytkownika komunikat do klienta, gdy użytkownik próbuje dodać lub zmienić dane w tabeli SalesPersonQuotaHistory . Wyzwalacz jest następnie modyfikowany, używając ALTER TRIGGER go tylko przy INSERT aktywnościach. Ten wyzwalacz jest przydatny, ponieważ przypomina użytkownikowi, że przy aktualizacji lub wstawianiu wierszy do tej tabeli należy także powiadomić dział Compensation.

CREATE TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
WITH ENCRYPTION  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

-- Now, change the trigger.  
ALTER TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
AFTER INSERT  
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

Zobacz też

WYZWALACZ DROP (Transact-SQL)
WŁĄCZ WYZWALACZ (Transact-SQL)
WYŁĄCZ WYZWALACZ (Transact-SQL)
DANE ZDARZEŃ (Transact-SQL)
sp_helptrigger (Transact-SQL)
Utwórz procedurę składowaną
sp_addmessage (Transact-SQL)
Transakcje
Uzyskaj informacje o wyzwalaczach DML
Uzyskiwanie informacji o wyzwalaczach DDL
sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL)
sys.sql_moduły (Transact-SQL)
sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL)
sys.wydarzenia_wyzwalacza_serwera (Transact-SQL)
sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)
Wprowadź zmiany schematu w bazach publikacji