sp_settriggerorder (T-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure 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.

Konvensi sintaks transact-SQL

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, DELETELOGON, 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:

  1. Pemicu tingkat server ditandai First
  2. Pemicu tingkat server lainnya
  3. Pemicu tingkat server ditandai Last
  4. Pemicu tingkat database ditandai First
  5. Pemicu tingkat database lainnya
  6. 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';