ALTER TRIGGER (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceDatabase SQL di Microsoft Fabric

Memodifikasi definisi pemicu DML, DDL, atau masuk yang sebelumnya dibuat oleh CREATE TRIGGER pernyataan. Pemicu dibuat dengan menggunakan CREATE TRIGGER. Mereka dapat dibuat langsung dari pernyataan Transact-SQL atau dari metode rakitan yang dibuat dalam runtime bahasa umum (CLR) Microsoft .NET Framework dan diunggah ke instans SQL Server. Untuk informasi selengkapnya tentang parameter yang digunakan dalam ALTER TRIGGER pernyataan, lihat CREATE TRIGGER (Transact-SQL).

Konvensi sintaks transact-SQL

Sintaks

-- 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> ]  

Argumen

schema_name
Adalah nama skema tempat pemicu DML berada. Pemicu DML dilingkupkan ke skema tabel atau tampilan tempat pemicu dibuat. skema*_name* bersifat opsional hanya jika pemicu DML dan tabel atau tampilan yang sesuai termasuk dalam skema default. schema_name tidak dapat ditentukan untuk pemicu DDL atau masuk.

trigger_name
Apakah pemicu yang ada untuk dimodifikasi.

tampilan tabel |
Adalah tabel atau tampilan tempat pemicu DML dijalankan. Menentukan nama tabel atau tampilan yang sepenuhnya memenuhi syarat bersifat opsional.

DATABASE
Menerapkan cakupan pemicu DDL ke database saat ini. Jika ditentukan, pemicu diaktifkan setiap kali event_type atau event_group terjadi dalam database saat ini.

SEMUA SERVER
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

Menerapkan cakupan pemicu DDL atau masuk ke server saat ini. Jika ditentukan, pemicu diaktifkan setiap kali event_type atau event_group terjadi di mana saja di server saat ini.

DENGAN ENKRIPSI
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

Mengenkripsi entri sys.syscommentssys.sql_modules yang berisi teks ALTER TRIGGER pernyataan. Menggunakan WITH ENCRYPTION mencegah pemicu diterbitkan sebagai bagian dari replikasi SQL Server. WITH ENCRYPTION tidak dapat ditentukan untuk pemicu CLR.

Catatan

Jika pemicu dibuat dengan menggunakan WITH ENCRYPTION, pemicu harus ditentukan lagi dalam ALTER TRIGGER pernyataan agar opsi ini tetap diaktifkan.

EXECUTE AS
Menentukan konteks keamanan tempat pemicu dijalankan. Memungkinkan Anda mengontrol akun pengguna yang digunakan instans SQL Server untuk memvalidasi izin pada objek database apa pun yang dirujuk oleh pemicu.

Untuk informasi selengkapnya, lihat EXECUTE AS Klausul (Transact-SQL).

NATIVE_COMPILATION
Menunjukkan bahwa pemicu dikompilasi secara asli.

Opsi ini diperlukan untuk pemicu pada tabel yang dioptimalkan memori.

SCHEMABINDING
Memastikan bahwa tabel yang direferensikan oleh pemicu tidak dapat dihilangkan atau diubah.

Opsi ini diperlukan untuk pemicu pada tabel yang dioptimalkan memori dan tidak didukung untuk pemicu pada tabel tradisional.

AFTER
Menentukan bahwa pemicu diaktifkan hanya setelah pernyataan SQL pemicu berhasil dijalankan. Semua tindakan kaskade referensial dan pemeriksaan batasan juga harus berhasil sebelum pemicu ini diaktifkan.

AFTER adalah default, jika hanya kata kunci FOR yang ditentukan.

Pemicu DML AFTER hanya dapat ditentukan pada tabel.

MELAINKAN
Menentukan bahwa pemicu DML dijalankan alih-alih pernyataan SQL pemicu, oleh karena itu, mengesampingkan tindakan pernyataan pemicu. ALIH-ALIH TIDAK dapat ditentukan untuk pemicu DDL atau masuk.

Paling-paling, satu pernyataan INSTEAD OF THAN per INSERT, UPDATE, atau DELETE dapat didefinisikan pada tabel atau tampilan. Namun, Anda dapat menentukan tampilan pada tampilan di mana setiap tampilan memiliki pemicuNYA sendiri ALIH-ALIH.

ALIH-ALIH pemicu tidak diizinkan pada tampilan yang dibuat dengan menggunakan WITH CHECK OPTION. SQL Server menimbulkan kesalahan ketika pemicu ALIH-ALIH ditambahkan ke tampilan yang DENGAN OPSI PEMERIKSAAN ditentukan. Pengguna harus menghapus opsi tersebut menggunakan ALTER VIEW sebelum menentukan pemicu INSTEAD OF.

{ [ DELETE ] [ , ] [ INSERT ] [ ] [ , ] UPDATE [ ] } | { [INSERT ] [ , ] [ UPDATE ] }
Menentukan pernyataan modifikasi data, ketika dicoba terhadap tabel atau tampilan ini, aktifkan pemicu DML. Setidaknya satu opsi harus ditentukan. Kombinasi apa pun dari ini dalam urutan apa pun diizinkan dalam definisi pemicu. Jika lebih dari satu opsi ditentukan, pisahkan opsi dengan koma.

Untuk pemicu INSTEAD OF, opsi tidak DELETE diizinkan pada tabel yang memiliki hubungan referensial yang menentukan tindakan kaskade ON DELETE. Demikian pula, opsi tidak UPDATE diizinkan pada tabel yang memiliki hubungan referensial yang menentukan tindakan kaskade ON UPDATE. Untuk informasi selengkapnya, lihat ALTER TABLE (Transact-SQL).

event_type
Adalah nama peristiwa bahasa Transact-SQL yang, setelah eksekusi, menyebabkan pemicu DDL diaktifkan. Peristiwa yang valid untuk pemicu DDL tercantum dalam Peristiwa DDL.

event_group
Adalah nama pengelompokan peristiwa bahasa Transact-SQL yang telah ditentukan sebelumnya. Pemicu DDL diaktifkan setelah eksekusi peristiwa bahasa Transact-SQL apa pun yang termasuk dalam event_group. Grup peristiwa yang valid untuk pemicu DDL tercantum dalam Grup Peristiwa DDL. Setelah ALTER TRIGGER selesai berjalan, event_group juga bertindak sebagai makro dengan menambahkan jenis peristiwa yang dicakup ke tampilan katalog sys.trigger_events.

BUKAN UNTUK REPLIKASI
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

Menunjukkan bahwa pemicu tidak boleh dijalankan ketika agen replikasi memodifikasi tabel yang terlibat dalam pemicu.

sql_statement
Adalah kondisi dan tindakan pemicu.

Untuk pemicu pada tabel yang dioptimalkan memori, satu-satunya sql_statement yang diizinkan di tingkat atas adalah blok ATOMIC. T-SQL yang diizinkan di dalam blok ATOMIC dibatasi oleh T-SQL yang diizinkan di dalam proc asli.

method_specifier NAMA <EKSTERNAL>
Berlaku untuk: SQL Server 2008 (10.0.x) dan yang lebih baru.

Menentukan metode assembly untuk mengikat dengan pemicu. Metode tidak boleh mengambil argumen dan mengembalikan kekosongan. class_name harus merupakan pengidentifikasi SQL Server yang valid dan harus ada sebagai kelas di rakitan dengan visibilitas perakitan. Kelas tidak dapat menjadi kelas berlapis.

Keterangan

Untuk informasi lebih lanjut tentang ALTER TRIGGER, lihat Keterangan di CREATE TRIGGER (Transact-SQL).

Catatan

Opsi EXTERNAL_NAME dan ON_ALL_SERVER tidak tersedia dalam database mandiri.

Pemicu DML

ALTER TRIGGER mendukung tampilan yang dapat diperbarui secara manual melalui pemicu INSTEAD OF pada tabel dan tampilan. SQL Server berlaku ALTER TRIGGER dengan cara yang sama untuk semua jenis pemicu (SETELAH, INSTEAD-OF).

Pemicu AFTER pertama dan terakhir yang akan dijalankan pada tabel dapat ditentukan dengan menggunakan sp_settriggerorder. Hanya satu pemicu AFTER pertama dan satu terakhir yang dapat ditentukan pada tabel. Jika ada pemicu AFTER lainnya pada tabel yang sama, pemicu tersebut dijalankan secara acak.

Jika pernyataan ALTER TRIGGER mengubah pemicu pertama atau terakhir, atribut pertama atau terakhir yang ditetapkan pada pemicu yang dimodifikasi akan dihapus, dan nilai pesanan harus diatur ulang dengan menggunakan sp_settriggerorder.

Pemicu AFTER dijalankan hanya setelah pernyataan SQL pemicu berhasil dijalankan. Eksekusi yang berhasil ini mencakup semua tindakan kaskade referensial dan pemeriksaan batasan yang terkait dengan objek yang diperbarui atau dihapus. Operasi pemicu AFTER memeriksa efek pernyataan pemicu dan juga semua kaskade UPDATE referensial dan DELETE tindakan yang disebabkan oleh pernyataan pemicu.

Ketika DELETE tindakan ke tabel turunan atau referensi adalah hasil dari CASCADE pada tabel DELETE induk, dan pemicu INSTEAD OF on DELETE ditentukan pada tabel turunan tersebut, pemicu diabaikan dan DELETE tindakan dieksekusi.

Pemicu DDL

Tidak seperti pemicu DML, pemicu DDL tidak terlingkup ke skema. Oleh karena itu, OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, dan OBJECTPROPERTY(EX) tidak dapat digunakan saat mengkueri metadata tentang pemicu DDL. Gunakan tampilan katalog sebagai gantinya. Untuk informasi selengkapnya, lihat Mendapatkan Informasi Tentang Pemicu DDL.

Pemicu Masuk

Azure SQL Database tidak mendukung pemicu pada peristiwa masuk.

Izin

Untuk mengubah pemicu DML memerlukan izin ALTER pada tabel atau tampilan tempat pemicu ditentukan.

Untuk mengubah pemicu DDL yang ditentukan dengan cakupan server (ON ALL SERVER) atau pemicu masuk memerlukan izin CONTROL SERVER di server. Untuk mengubah pemicu DDL yang ditentukan dengan cakupan database (ON DATABASE) memerlukan izin ALTER ANY DATABASE DDL TRIGGER dalam database saat ini.

Contoh

Contoh berikut membuat pemicu DML dalam AdventureWorks2025 database, yang mencetak pesan yang ditentukan pengguna ke klien saat pengguna mencoba menambahkan atau mengubah data dalam SalesPersonQuotaHistory tabel. Pemicu kemudian dimodifikasi dengan menggunakan ALTER TRIGGER untuk menerapkan pemicu hanya pada INSERT aktivitas. Pemicu ini berguna karena mengingatkan pengguna bahwa memperbarui atau menyisipkan baris ke dalam tabel ini untuk juga memberi tahu Compensation departemen.

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  

Lihat Juga

DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_helptrigger (T-SQL)
Membuat Prosedur Tersimpan
sp_addmessage (T-SQL)
Transaksi
Mendapatkan Informasi Tentang Pemicu DML
Mendapatkan Informasi Tentang Pemicu DDL
sys.triggers (Transact-SQL)
sys.trigger_events (T-SQL)
sys.sql_modul (Transact-SQL)
sys.assembly_modules (T-SQL)
sys.server_triggers (T-SQL)
sys.server_trigger_events (T-SQL)
sys.server_sql_modules (T-SQL)
sys.server_assembly_modules (T-SQL)
Membuat Perubahan Skema pada Database Publikasi