sp_settriggerorder (T-SQL)
Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance
Menentukan pemicu AFTER
yang diaktifkan terlebih dahulu atau terakhir. Pemicu AFTER
yang diaktifkan antara pemicu pertama dan terakhir dijalankan dalam urutan yang tidak ditentukan.
Sintaks
sp_settriggerorder
[ @triggername = ] N'triggername'
, [ @order = ] 'order'
, [ @stmttype = ] 'stmttype'
[ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]
Argumen
[ @triggername = ] N'triggername'
Nama pemicu dan skema tempat pemicu berada, jika berlaku, yang urutannya akan diatur atau diubah. @triggername adalah nvarchar(517), tanpa default, dan dalam format [ trigger_schema . ] trigger_name. Jika nama tidak sesuai dengan pemicu atau jika nama sesuai dengan INSTEAD OF
pemicu, prosedur mengembalikan kesalahan. Skema tidak dapat ditentukan untuk pemicu DDL atau masuk.
[ @order = ] 'order'
Pengaturan untuk urutan pemicu baru. @order adalah varchar(10), dan bisa menjadi salah satu nilai berikut.
Nilai | Deskripsi |
---|---|
First |
Pemicu dipicu terlebih dahulu. |
Last |
Pemicu diaktifkan terakhir. |
None |
Pemicu diaktifkan dalam urutan yang tidak ditentukan. |
Penting
Pemicu First
dan Last
harus dua pemicu yang berbeda.
[ @stmttype = ] 'stmttype'
Menentukan pernyataan Transact-SQL yang mengaktifkan pemicu. @stmttype adalah varchar(50), dan dapat berupa INSERT
, , UPDATE
, DELETE
LOGON
, atau peristiwa pernyataan T-SQL apa pun yang tercantum dalam Peristiwa DDL. Grup peristiwa tidak dapat ditentukan.
Pemicu dapat ditetapkan sebagai First
pemicu atau Last
untuk jenis pernyataan hanya setelah pemicu tersebut didefinisikan sebagai pemicu untuk jenis pernyataan tersebut. Misalnya, pemicu TR1
dapat ditunjuk First
untuk INSERT
di atas tabel T1
jika TR1
didefinisikan sebagai INSERT
pemicu. Mesin Database mengembalikan kesalahan jika TR1
, yang didefinisikan hanya sebagai INSERT
pemicu, diatur sebagai First
atau Last
pemicu untuk pernyataan UPDATE
. Untuk informasi selengkapnya, lihat bagian Keterangan.
@namespace = { 'DATABASE' | 'SERVER' | NULL }
Ketika @triggername adalah pemicu DDL, @namespace menentukan apakah @triggername dibuat dengan cakupan database atau cakupan server. Jika @triggername adalah pemicu masuk, SERVER
harus ditentukan. Untuk informasi selengkapnya tentang cakupan pemicu DDL, lihat Pemicu DDL. Jika tidak ditentukan, atau jika NULL
ditentukan, @triggername adalah pemicu DML.
Mengembalikan nilai kode
0
(berhasil) dan 1
(kegagalan).
Keterangan
Bagian ini membahas pertimbangan untuk pemicu bahasa manipulasi data (DML) dan bahasa definisi data (DDL).
Pemicu DML
Hanya ada satu First
dan satu Last
pemicu untuk setiap pernyataan pada satu tabel.
First
Jika pemicu sudah ditentukan pada tabel, database, atau server, Anda tidak dapat menunjuk pemicu baru seperti First
untuk tabel, database, atau server yang sama untuk @stmttype yang sama. Pembatasan ini juga menerapkan Last
pemicu.
Replikasi secara otomatis menghasilkan pemicu pertama untuk tabel apa pun yang disertakan dalam langganan pembaruan segera atau pembaruan antrean. Replikasi mengharuskan pemicunya adalah pemicu pertama. Replikasi menimbulkan kesalahan saat Anda mencoba menyertakan tabel dengan pemicu pertama dalam langganan pembaruan segera atau pembaruan antrean. Jika Anda mencoba membuat pemicu pemicu pertama setelah tabel disertakan dalam langganan, sp_settriggerorder
mengembalikan kesalahan. Jika Anda menggunakan ALTER TRIGGER
pemicu replikasi, atau menggunakan sp_settriggerorder
untuk mengubah pemicu replikasi menjadi Last
atau None
pemicu, langganan tidak berfungsi dengan benar.
Pemicu DDL
Jika pemicu DDL dengan cakupan database dan pemicu DDL dengan cakupan server ada pada peristiwa yang sama, Anda dapat menentukan bahwa kedua pemicu menjadi First
pemicu atau Last
pemicu. Namun, pemicu cakupan server selalu diaktifkan terlebih dahulu. Secara umum, urutan eksekusi pemicu DDL yang ada pada peristiwa yang sama adalah sebagai berikut:
- Pemicu tingkat server ditandai
First
- Pemicu tingkat server lainnya
- Pemicu tingkat server ditandai
Last
- Pemicu tingkat database ditandai
First
- Pemicu tingkat database lainnya
- Pemicu tingkat database ditandai
Last
Pertimbangan pemicu umum
ALTER TRIGGER
Jika pernyataan mengubah pemicu pertama atau terakhir, First
atribut atau Last
yang awalnya diatur pada pemicu dihilangkan, dan nilainya digantikan oleh None
. Nilai pesanan harus diatur ulang dengan menggunakan sp_settriggerorder
.
Jika pemicu yang sama harus ditetapkan sebagai urutan pertama atau terakhir untuk lebih dari satu jenis pernyataan, sp_settriggerorder
harus dijalankan untuk setiap jenis pernyataan. Selain itu, pemicu harus terlebih dahulu didefinisikan untuk jenis pernyataan sebelum dapat ditetapkan sebagai atau Last
pemicu untuk diaktifkan untuk jenis pernyataan tersebutFirst
.
Izin
Mengatur urutan pemicu DDL dengan cakupan server (dibuat ON ALL SERVER
) atau pemicu masuk memerlukan CONTROL SERVER
izin.
Mengatur urutan pemicu DDL dengan cakupan database (dibuat ON DATABASE
) memerlukan ALTER ANY DATABASE DDL TRIGGER
izin.
Mengatur urutan pemicu DML memerlukan ALTER
izin pada tabel atau tampilan tempat pemicu ditentukan.
Contoh
J. Mengatur urutan penembakan untuk pemicu DML
Contoh berikut menentukan bahwa pemicu adalah pemicu uSalesOrderHeader
pertama yang UPDATE
diaktifkan setelah operasi terjadi pada Sales.SalesOrderHeader
tabel.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
@order = 'First',
@stmttype = 'UPDATE';
B. Mengatur urutan penembakan untuk pemicu DDL
Contoh berikut menentukan bahwa pemicu adalah pemicu ddlDatabaseTriggerLog
pertama yang diaktifkan setelah peristiwa ALTER_TABLE
terjadi dalam AdventureWorks2022
database.
USE AdventureWorks2022;
GO
EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
@order = 'First',
@stmttype = 'ALTER_TABLE',
@namespace = 'DATABASE';