UBAH PEMICU (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Memodifikasi definisi pemicu DML, DDL, atau masuk yang sebelumnya dibuat oleh pernyataan CREATE TRIGGER. 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 pernyataan UBAH PEMICU, lihat CREATE TRIGGER (Transact-SQL).

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

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 pernyataan ALTER TRIGGER. 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 pernyataan ALTER TRIGGER agar opsi ini tetap diaktifkan.

JALANKAN SEBAGAI
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 Clause (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 banyak, satu pemicu ALIH-ALIH per pernyataan INSERT, UPDATE, atau DELETE dapat ditentukan 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 ALIH-ALIH.

{ [ 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 ALIH-ALIH, opsi DELETE tidak diizinkan pada tabel yang memiliki hubungan referensial yang menentukan tindakan bertingkat ON DELETE. Demikian pula, opsi UPDATE tidak 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 dicakupnya 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 selengkapnya tentang ALTER TRIGGER, lihat Komentar 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 ALIH-ALIH pemicu pada tabel dan tampilan. SQL Server menerapkan ALTER TRIGGER dengan cara yang sama untuk semua jenis pemicu (SETELAH, ALIH-ALIH).

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 dihilangkan, 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 tindakan UPDATE dan DELETE bertingkat referensial yang disebabkan oleh pernyataan pemicu.

Saat tindakan DELETE ke anak atau tabel referensi adalah hasil DARI CASCADE pada DELETE dari tabel induk, dan ALIH-ALIH pemicu pada DELETE ditentukan pada tabel anak tersebut, pemicu diabaikan dan tindakan DELETE dijalankan.

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 UBAH PEMICU DDL DATABASE APA PUN dalam database saat ini.

Contoh

Contoh berikut membuat pemicu DML dalam AdventureWorks2022 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

JATUHKAN PEMICU (Transact-SQL)
AKTIFKAN PEMICU (Transact-SQL)
NONAKTIFKAN PEMICU (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_modules (T-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