Aracılığıyla paylaş


sp_settriggerorder (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

İlk veya son ateşlenen tetikleri belirtir AFTER . AFTER İlk ve son tetik arasında ateşlenen tetikleyiciler belirsiz sırayla çalıştırılır.

Transact-SQL söz dizimi kuralları

Sözdizimi

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

Arguments

[ @triggername = ] N'triggername'

Tetikleyicinin adı ve ait olduğu şema, eğer uygunsa, hangi sıranın ayarlanması veya değiştirileceği. @triggername , varsayılan olmayan nvarchar(517)'dir ve [ trigger_schema . ] trigger_name formatındadır. Eğer isim tetikleyiciye karşılık gelmiyorsa veya isim tetikleyiciye INSTEAD OF karşılık geliyorsa, prosedür hata döndürür. DDL veya giriş tetikleyicileri için bir şema belirtilemez.

[ @order = ] 'düzen'

Tetikleyicinin yeni sırası için ayar. @ordervarchar(10)'dur ve aşağıdaki değerlerden herhangi biri olabilir.

Değer Description
First Tetik önce ateşlenir.
Last Tetik en son ateşlenir.
None Tetik belirsiz bir sırayla ateşlenir.

Önemli

ve FirstLast tetikleyicileri iki farklı tetikleyici olmalı.

[ @stmttype = ] 'stmttype'

Tetikleyiciyi ateşleyen Transact-SQL ifadesini belirtir. @stmttypevarchar(50)'dir ve INSERT, UPDATE, DELETE, LOGON, veya DDL Olaylarında listelenen herhangi bir T-SQL ifade olayı olabilir. Etkinlik grupları belirtilemez.

Bir tetikleyici, ancak o tetikleyici o ifade türü için tetikleyici olarak tanımlandıktan sonra bir ifade türü için veya First tetikleyici olarak atanabilirLast. Örneğin, TR1 tetikleyici olarak tanımlanmışsa First tablo INSERTT1 üzerinde tetikleyici olarak belirlenebilir TR1INSERT. Veritabanı Motoru, TR1yalnızca tetikleyici INSERTFirst olarak tanımlanan , bir Last ifadenin veya UPDATE tetikleyicisi olarak ayarlandığında hata döndürür. Daha fazla bilgi için Açıklamalar bölümüne bakın.

@namespace = { 'VERITABANI' | 'SUNUCU' | NULL }

@triggername bir DDL tetikleyicisi olduğunda, @namespace @triggername veritabanı kapsamı mı yoksa sunucu kapsamı mı oluşturulduğunu belirtir. Eğer @triggername bir giriş tetikleyiciyse, SERVER belirtilmelidir. DDL tetikleyici dürbünü hakkında daha fazla bilgi için bkz. DDL tetikleyicileri. Belirtilmemişse ya NULL da belirtilmişse, @triggername bir DML tetikleyicisidir.

Dönüş kodu değerleri

0 (başarı) ve 1 (başarısızlık).

Açıklamalar

Bu bölüm, veri işleme dili (DML) ve veri tanım dili (DDL) tetikleyicileri için dikkate alınan konuları tartışmaktadır.

DML tetikleyicileri

Tek bir tabloda her ifade için sadece bir First tetikleyici Last olabilir.

Eğer bir First tetikleyici zaten tabloda, veritabanında veya sunucuda tanımlanmışsa, aynı First için aynı tablo, veritabanı veya sunucu için yeni bir tetikleyici atamazsınız. Bu kısıtlama tetikleyicileri de uygular Last .

Çoğaltma, anında güncelleme veya kuyruklanan güncelleme aboneliğine dahil edilen herhangi bir tablo için otomatik olarak ilk tetikleyici oluşturur. Çoğaltma için tetikleyicinin ilk tetikleyici olması gerekir. Replikasyon, anında güncelleme veya kuyruklanan güncelleme aboneliğine ilk tetikleyici olan bir tabloyu eklemeye çalıştığınızda hata çıkarır. Bir tetikleyiciyi aboneliğe bir tablo dahil edildikten sonra ilk tetikleyici yapmaya çalışırsanız, sp_settriggerorder hata döner. Replikasyon ALTER TRIGGER tetikleyicisini kullanırsanız veya sp_settriggerorder replikasyon tetikleyicisini bir Last veya None tetikleyiciye çevirirseniz, abonelik doğru çalışmaz.

DDL tetikleyicileri

Eğer aynı olayda veritabanı kapsamına sahip bir DDL tetikleyici ve sunucu kapsamına sahip bir DDL tetikleyici varsa, her iki tetikleyicinin de tetikleyici First veya Last tetikleyici olduğunu belirtebilirsiniz. Ancak, sunucu kapsamına bağlı tetikleyiciler her zaman önce ateşlenir. Genel olarak, aynı olayda var olan DDL tetikleyicilerinin yürütülme sırası şöyledir:

  1. Sunucu düzeyinde işaretlenmiş tetikleyici First
  2. Diğer sunucu düzeyindeki tetikleyiciler
  3. Sunucu düzeyinde işaretlenmiş tetikleyici Last
  4. Veritabanı düzeyinde tetikleyici işaretlenmiş First
  5. Diğer veritabanı düzeyinde tetikleyiciler
  6. Veritabanı düzeyinde tetikleyici işaretlenmiş Last

Genel tetikleyiciyle ilgili dikkat edilmesi gerekenler

Bir ALTER TRIGGER ifade ilk veya son tetikleyiciyi değiştirirse, First tetikleyicide orijinal olarak ayarlanan veya Last öznitelik düşürüldü ve değer yerine None. Sipariş değeri kullanılarak sp_settriggerordersıfırlanmalıdır.

Aynı tetikleyici, birden fazla ifade türü için birinci veya son emir olarak belirlenmek zorundaysa, sp_settriggerorder her ifade türü için yürütülmelidir. Ayrıca, tetikleyici, önce bir ifade türü için tanımlanmalıdır ve önce o ifade türü için ateş edilecek veya First tetikleyici olarak belirlenmelidirLast.

Permissions

DDL tetikleyicisinin sırasını sunucu kapsamı (oluşturuldu ON ALL SERVER) veya giriş tetikleyicisi ile ayarlamak için izin gereklidir CONTROL SERVER .

Veritabanı kapsamı (oluşturulan ON DATABASE) ile bir DDL tetikleyicisinin sırasını ayarlamak için izin gereklidir ALTER ANY DATABASE DDL TRIGGER .

DML tetikleyicisinin sırasını ayarlamak, tetikleyicinin tanımlandığı tablo veya görünüm üzerinde izin gerektirir ALTER .

Örnekler

A. DML tetikleyici için ateşleme sırasını ayarlayın

Aşağıdaki örnek, uSalesOrderHeader bir işlem masada UPDATE gerçekleştikten Sales.SalesOrderHeader sonra tetikleyicinin ilk ateşlenen tetik olduğunu belirtir.

USE AdventureWorks2022;
GO

EXECUTE sp_settriggerorder
    @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

B. DDL tetikleyici için ateşleme sırasını ayarlayın

Aşağıdaki örnek, ddlDatabaseTriggerLog tetikleyicinin veritabanında bir ALTER_TABLE olay gerçekleştikten AdventureWorks2025 sonra ateşlenen ilk tetikleyici olduğunu belirtir.

USE AdventureWorks2022;
GO

EXECUTE sp_settriggerorder
    @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';