Aracılığıyla paylaş


TETIKLEYICI YARAT (Transact-SQL)

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

DML, DDL veya oturum açma tetikleyicisi oluşturur. Tetikleyici, veritabanı sunucusunda bir olay oluştuğunda otomatik olarak çalışan özel bir saklı yordam türüdür. DML tetikleyicileri, kullanıcı bir veri işleme dili (DML) olayı aracılığıyla verileri değiştirmeye çalıştığında çalışır. DML olayları, tablo veya INSERT görünümdeki , UPDATEveya deyimleridirDELETE. Tablo satırlarının etkilenip etkilenmediği, geçerli bir olay tetiklendiğinde bu tetikleyiciler tetiklenir. Daha fazla bilgi için bkz. DML Tetikleyicileri.

DDL tetikleyicileri çeşitli veri tanımı dili (DDL) olaylarına yanıt olarak çalışır. Bu olaylar öncelikli olarak Transact-SQL CREATE, ALTERve DROP deyimlerine ve DDL benzeri işlemler gerçekleştiren belirli sistem saklı yordamlarına karşılık gelir.

Oturum açma tetikleyicileri, kullanıcının oturumu oluşturulurken ortaya çıkan olaya yanıt olarak LOGON tetiklenir. Tetikleyicileri doğrudan Transact-SQL deyimlerinden veya Microsoft .NET Framework ortak dil çalışma zamanında (CLR) oluşturulan ve SQL Server örneğine yüklenen derleme yöntemlerinden oluşturabilirsiniz. SQL Server, belirli bir deyim için birden çok tetikleyici oluşturmanıza olanak tanır.

Önemli

Tetikleyicilerin içindeki kötü amaçlı kod, yükseltilmiş ayrıcalıklar altında çalıştırılabilir. Bu tehdidi azaltma hakkında daha fazla bilgi için bkz. Tetikleyici güvenliğini yönetme.

Uyarı

.NET Framework CLR'nin SQL Server ile tümleştirilmesi bu makalede ele alınmıştır. CLR entegrasyonu, Azure SQL Database veya Microsoft Fabric'teki SQL veritabanı için geçerli değildir.

Transact-SQL söz dizimi kuralları

Sözdizimi

SQL Server söz dizimi

Tablo veya görünümde bir , INSERTveya UPDATE deyiminde DELETEtetikleyici (DML tetikleyicisi):

CREATE [ OR ALTER ] TRIGGER [ schema_name . ] trigger_name
ON { table | view }
[ WITH <dml_trigger_option> [ , ...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ 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

Tabloya yönelik bir INSERT, UPDATEveya DELETE deyiminde tetikleyici (bellek için iyileştirilmiş tablolarda DML tetikleyicisi):

CREATE [ OR ALTER ] TRIGGER [ schema_name . ] trigger_name
ON { table }
[ WITH <dml_trigger_option> [ , ...n ] ]
{ FOR | AFTER }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS { sql_statement  [ ; ] [ , ...n ] }

<dml_trigger_option> ::=
    [ NATIVE_COMPILATION ]
    [ SCHEMABINDING ]
    [ EXECUTE AS Clause ]

, , CREATE, , ALTER, DROP, GRANT, DENYveya REVOKE deyiminde UPDATEtetikleyici (DDL tetikleyicisi):

CREATE [ OR ALTER ] TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ , ...n ] ]
{ FOR | AFTER } { event_type | event_group } [ , ...n ]
AS { sql_statement  [ ; ] [ , ...n ] | EXTERNAL NAME < method specifier >  [ ; ] }

<ddl_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

Bir LOGON olayda tetikleyici (Oturum açma tetikleyicisi):

CREATE [ OR 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 ]

Doku söz diziminde Azure SQL Veritabanı veya SQL veritabanı

Tablo veya görünümde bir , INSERTveya UPDATE deyiminde DELETEtetikleyici (DML tetikleyicisi):

CREATE [ OR ALTER ] TRIGGER [ schema_name . ] trigger_name
ON { table | view }
 [ WITH <dml_trigger_option> [ , ...n ] ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
  AS { sql_statement  [ ; ] [ , ...n ] [ ; ] > }

<dml_trigger_option> ::=
        [ EXECUTE AS Clause ]

, , CREATE, , ALTER, DROP, GRANT, DENYveya REVOKE deyiminde UPDATE STATISTICStetikleyici (DDL tetikleyicisi):

CREATE [ OR ALTER ] TRIGGER trigger_name
ON { DATABASE }
 [ WITH <ddl_trigger_option> [ , ...n ] ]
{ FOR | AFTER } { event_type | event_group } [ , ...n ]
AS { sql_statement  [ ; ] [ , ...n ]  [ ; ] }

<ddl_trigger_option> ::=
    [ EXECUTE AS Clause ]

Tartışmalar

VEYA ALTER

Şunlar için geçerlidir: SQL Server 2016 (13.x) SP1 ve sonraki sürümler, Azure SQL Veritabanı ve Microsoft Fabric'teki SQL veritabanı.

Tetikleyiciyi koşullu olarak yalnızca zaten varsa değiştirir.

schema_name

DML tetikleyicisinin ait olduğu şemanın adı. DML tetikleyicilerinin kapsamı, oluşturuldukları tablonun veya görünümün şemasına göre belirlenmiştir. schema_name DDL veya oturum açma tetikleyicileri için belirtilemiyor.

trigger_name

Tetikleyicinin adı. trigger_name veya ile # trigger_name ## için kurallara uyması gerekir.

masa | görünüm

DML tetikleyicisinin üzerinde çalıştığı tablo veya görünüm. Bu tablo veya görünüm bazen tetikleyici tablosu veya tetikleyici görünümü olarak adlandırılır. Tablonun veya görünümün tam adını belirtmek isteğe bağlıdır. Bir görünüme yalnızca tetikleyiciyle INSTEAD OF başvurabilirsiniz. Yerel veya genel geçici tablolarda DML tetikleyicileri tanımlayamazsınız.

VERİTABANI

DDL tetikleyicisinin kapsamını geçerli veritabanına uygular. Belirtildiyse, geçerli veritabanında event_type veya event_group oluştuğunda tetikleyici tetikler.

TÜM SUNUCU

Geçerli sunucuya bir DDL veya oturum açma tetikleyicisinin kapsamını uygular. Belirtildiyse, geçerli sunucunun herhangi bir yerinde event_type veya event_group oluştuğunda tetikleyici tetikler.

ŞIFRELEME ILE

deyiminin metnini gizler CREATE TRIGGER . kullanarak WITH ENCRYPTION tetikleyicinin SQL Server çoğaltmasının bir parçası olarak yayımlanması engellenir. WITH ENCRYPTION CLR tetikleyicileri için belirtilemiyor.

OLARAK ÇALIŞTIR

Tetikleyicinin yürütüldiği güvenlik bağlamını belirtir. SQL Server örneğinin tetikleyici tarafından başvurulan tüm veritabanı nesneleri üzerindeki izinleri doğrulamak için hangi kullanıcı hesabını kullandığını denetlemenizi sağlar.

Bellek için iyileştirilmiş tablolardaki tetikleyiciler için bu seçenek gereklidir.

Daha fazla bilgi için bkz . EXECUTE AS Yan Tümcesi.

NATIVE_COMPILATION

Tetikleyicinin yerel olarak derlendiğini gösterir.

Bellek için iyileştirilmiş tablolardaki tetikleyiciler için bu seçenek gereklidir.

SCHEMABINDING

Tetikleyici tarafından başvuruda bulunılan tabloların bırakılmamasını veya değiştirilememesini sağlar.

Bu seçenek bellek için iyileştirilmiş tablolardaki tetikleyiciler için gereklidir ve geleneksel tablolardaki tetikleyiciler için desteklenmez.

FOR | SONRA

FOR veya AFTER DML tetikleyicisinin yalnızca tetikleyici SQL deyiminde belirtilen tüm işlemler başarıyla başlatıldığında tetiklendiğini belirtir. Bu tetikleyici tetiklemeden önce tüm bilgi işlem art arda eylemleri ve kısıtlama denetimleri de başarılı olmalıdır.

Görünümlerde tetikleyiciler tanımlayamazsınız AFTER .

ONUN YERİNE

Tetikleyen SQL deyimi yerine DML tetikleyicisinin başlatıldığını ve bu nedenle tetikleyici deyimlerinin eylemlerini geçersiz kılacağını belirtir. DDL veya oturum açma tetikleyicileri için belirtemezsiniz INSTEAD OF .

En fazla, tablo veya görünümde , INSTEAD OFveya INSERT deyimi başına UPDATEbir tetikleyici tanımlayabilirsinizDELETE. Ayrıca, her görünümün kendi INSTEAD OF tetikleyicisine sahip olduğu görünümlerde görünümler tanımlayabilirsiniz.

kullanan INSTEAD OFgüncelleştirilebilir görünümlerde tetikleyiciler tanımlayamazsınızWITH CHECK OPTION. Bunun yapılması, tetikleyici belirtilen güncelleştirilebilir görünüme INSTEAD OF eklendiğinde WITH CHECK OPTION hatayla sonuçlanır. Tetikleyiciyi tanımlamadan ALTER VIEW önce kullanarak INSTEAD OF bu seçeneği kaldırırsınız.

{ [ SIL ] [ , ] [ EKLE ] [ , ] [ GÜNCELLEME ] }

Bu tablo veya görünümde denendiğinde DML tetikleyicisini etkinleştiren veri değişikliği deyimlerini belirtir. En az bir seçenek belirtin. Bu seçeneklerin herhangi bir bileşimini tetikleyici tanımında herhangi bir sırada kullanın.

Tetikleyiciler içinINSTEAD OF, bilgi ilişkisi olan tablolarda art arda eylem DELETEbelirterek seçeneğini kullanamazsınızON DELETE. Benzer şekilde, UPDATE bilgi ilişkisi olan tablolarda art arda eylem ON UPDATEbelirterek bu seçeneğe izin verilmez.

EKLEME ILE

Şunlar için geçerlidir: SQL Server 2008 (10.0.x) ile SQL Server 2008 R2 (10.50.x) arasında.

Var olan bir türün ek tetikleyicisinin eklenmesi gerektiğini belirtir. WITH APPEND tetikleyicilerle INSTEAD OF kullanılamaz veya bir AFTER tetikleyici açıkça belirtilirse. Geriye dönük uyumluluk için yalnızca veya WITH APPENDolmadan FOR belirtildiğinde INSTEAD OF kullanınAFTER. Kullanıp kullanmayabileceğinizi WITH APPEND belirtemezsiniz EXTERNAL NAME (yani tetikleyici bir CLR tetikleyicisiyse).

event_type

Başlatma sonrasında bir DDL tetikleyicisinin tetiklenene Transact-SQL dil olayının adı. DDL tetikleyicileri için geçerli olaylar DDL Olayları'nda listelenir.

event_group

Transact-SQL dil olaylarının önceden tanımlanmış gruplandırma adı. DDL tetikleyicisi, event_group ait herhangi bir Transact-SQL dil olayı başlatıldıktan sonra tetikler. DDL tetikleyicileri için geçerli olay grupları DDL Olay Grupları'nda listelenir.

CREATE TRIGGER çalıştırma tamamlandıktan sonra event_group, kapsadığı olay türlerini katalog görünümüne sys.trigger_events ekleyerek makro işlevi de görür.

ÇOĞALTMA IÇIN DEĞIL

Bir çoğaltma aracısı tetikleyiciye dahil olan tabloyu değiştirdiğinde tetikleyicinin çalıştırılmaması gerektiğini gösterir.

sql_statement

Tetikleyici koşulları ve eylemleri. Tetikleyici koşulları, denenen DML, DDL veya oturum açma olaylarının tetikleyici eylemlerinin çalıştırılmasına neden olup olmadığını belirleyen ek ölçütler belirtir.

İşlem denendiğinde Transact-SQL deyimlerinde belirtilen tetikleyici eylemleri geçerlilik kazanır.

Tetikleyiciler, özel durumlar dışında herhangi bir sayıda ve türde Transact-SQL deyimi içerebilir. Daha fazla bilgi için bkz. Açıklamalar. Tetikleyici, bir veri değişikliğine veya tanım deyimine göre verileri denetlemek veya değiştirmek için tasarlanmıştır. Tetikleyici kullanıcıya veri döndürmemelidir. Tetikleyicideki Transact-SQL deyimleri genellikle akış denetimi dilini içerir.

DML tetikleyicileri silinen ve eklenen mantıksal (kavramsal) tabloları kullanır. Bunlar, tetikleyicinin tanımlandığı tabloya, yani kullanıcı eyleminin denendiği tabloya yapısal olarak benzer. Silinen ve eklenen tablolar, kullanıcı eylemi tarafından değiştirilebilen satırların eski değerlerini veya yeni değerlerini tutar. Örneğin, tablodaki deleted tüm değerleri almak için şunu kullanın:

SELECT * FROM deleted;

Daha fazla bilgi için bkz. Eklenen ve silinen tabloları kullanma.

DDL ve oturum açma tetikleyicileri EVENTDATA işlevini kullanarak tetikleyici olayı hakkındaki bilgileri yakalar. Daha fazla bilgi için bkz. EVENTDATA İşlevini kullanma.

SQL Server, tablo veya görünümlerde tetikleyici aracılığıyla metin, ntext veya görüntü sütunlarının INSTEAD OF güncelleştirilmesini sağlar.

Önemli

ntext, metin ve görüntü veri türleri, Microsoft SQL Server'ın gelecek bir sürümünde kaldırılacaktır. Bu veri türlerini yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmeyi planlayın. Bunun yerine nvarchar(max), varchar(max)ve varbinary(max) kullanın. Hem hem de AFTERINSTEAD OF tetikleyicileri eklenen ve silinen tablolarda varchar(max), nvarchar(max)ve varbinary(max) verilerini destekler.

Bellek için iyileştirilmiş tablolardaki tetikleyiciler için en üst düzeyde izin verilen tek sql_statement bir ATOMIC blok olur. Blok içinde ATOMIC izin verilen T-SQL, yerel procs içinde izin verilen T-SQL ile sınırlıdır.

<method_specifier>

CLR tetikleyicisi için, tetikleyiciyle bağlanacak derlemenin yöntemini belirtir. Yöntemin bağımsız değişken almaması ve void döndürmesi gerekir. class_name geçerli bir SQL Server tanımlayıcısı olmalı ve derleme görünürlüğü ile derlemede sınıf olarak bulunmalıdır. Sınıfın ad alanı bölümlerini ayırmak için kullanan . ad alanı nitelenmiş bir adı varsa, sınıf adı [ ] veya " " sınırlayıcıları kullanılarak sınırlanmalıdır. Sınıf iç içe geçmiş bir sınıf olamaz.

Uyarı

Varsayılan olarak, SQL Server'ın CLR kodunu çalıştırma özelliği kapalıdır. Yönetilen kod modüllerine başvuran veritabanı nesneleri oluşturabilir, değiştirebilir ve bırakabilirsiniz, ancak clr etkin seçeneği sp_configure ile etkinleştirilmediği sürece bu başvurular SQL Server örneğinde çalışmaz.

DML tetikleyicileri için açıklamalar

DML tetikleyicileri genellikle iş kurallarını ve veri bütünlüğünü zorlamak için kullanılır. SQL Server, ve ALTER TABLE deyimleri aracılığıyla CREATE TABLE bildirim temelli bilgi tutarlılığı (DRI) sağlar. Ancak DRI, veritabanları arası bilgi tutarlılığı sağlamaz. Bilgi tutarlılığı, tabloların birincil ve yabancı anahtarları arasındaki ilişkilerle ilgili kuralları ifade eder. Bilgi tutarlılığını zorlamak için ve PRIMARY KEYiçindeki FOREIGN KEY ve ALTER TABLE kısıtlamalarını kullanınCREATE TABLE. Tetikleyici tablosunda kısıtlamalar varsa, tetikleyici çalıştırıldıktan sonra INSTEAD OF ve tetikleyici çalışmadan önce AFTER denetlenırlar. Kısıtlamalar ihlal edilirse tetikleyici INSTEAD OF eylemleri geri alınır ve AFTER tetikleyici tetiklenmez.

kullanarak AFTERbir tabloda çalıştırılacak ilk ve son sp_settriggerorder tetikleyicileri belirtebilirsiniz. Bir tablodaki her AFTER, INSERTve işlemi için yalnızca bir ilk ve UPDATE son DELETE tetikleyici belirtebilirsiniz. Aynı tabloda başka AFTER tetikleyiciler varsa, bunlar rastgele çalıştırılır.

Bir ALTER TRIGGER deyim bir ilk veya son tetikleyiciyi değiştirirse, değiştirilen tetikleyicide ayarlanan ilk veya son öznitelik bırakılır ve kullanarak sp_settriggerordersipariş değerini sıfırlamanız gerekir.

Tetikleyici AFTER yalnızca tetikleyici SQL deyimi başarıyla çalıştırıldıktan sonra çalıştırılır. Bu başarılı yürütme, güncelleştirilen veya silinen nesneyle ilişkili tüm başvurusal art arda eylemleri ve kısıtlama denetimlerini içerir. , AFTER aynı tabloda yinelemeli olarak tetikleyici INSTEAD OF tetiklemez.

Tabloda tanımlanan bir INSTEAD OF tetikleyici, normalde tetikleyiciyi yeniden tetikleyen INSTEAD OF bir deyim çalıştırırsa, tetikleyici özyinelemeli olarak çağrılmaz. Bunun yerine, deyimi tablonun tetikleyicisi yokmuş INSTEAD OF gibi işler ve kısıtlama işlemleri zincirini başlatır ve AFTER yürütmeleri tetikler. Örneğin, bir tetikleyici bir tablo için tetikleyici olarak INSTEAD OF INSERT tanımlanmışsa. Tetikleyici aynı tabloda bir INSERT deyim çalıştırırsa, INSERT tetikleyici tarafından INSTEAD OF başlatılan deyim tetikleyiciyi yeniden çağırmaz. Tetikleyici INSERT tarafından başlatılan kısıtlama eylemlerini çalıştırma ve tablo için tanımlanan tetikleyicileri AFTER INSERT tetikleme işlemini başlatır.

Görünümde tanımlanan bir INSTEAD OF tetikleyici, normalde tetikleyiciyi yeniden tetikleyen görünümde INSTEAD OF bir deyim çalıştırdığında, özyinelemeli olarak çağrılmaz. Bunun yerine, deyimi görünümün temel alınan temel tablolarında yapılan değişiklikler olarak çözümlenir. Bu durumda, görünüm tanımının güncelleştirilebilir görünüm için tüm kısıtlamaları karşılaması gerekir. Güncelleştirilebilir görünümlerin tanımı için bkz. Görünüm Aracılığıyla Verileri Değiştirme.

Örneğin, bir tetikleyici bir görünüm için tetikleyici olarak INSTEAD OF UPDATE tanımlanmışsa. Tetikleyici aynı görünüme başvuran bir UPDATE deyim çalıştırır, UPDATE tetikleyici tarafından INSTEAD OF başlatılan deyim tetikleyiciyi yeniden çağırmaz. Tetikleyici UPDATE tarafından başlatılan görünümde tetikleyicisi yok INSTEAD OF gibi işlenir. tarafından UPDATE değiştirilen sütunlar tek bir temel tabloya çözümlenmelidir. Temel alınan bir tabloda yapılan her değişiklik, tablo için tanımlanan kısıtlamaları uygulama ve tetikleme AFTER tetikleyicileri zincirini başlatır.

Belirli sütunlar için UPDATE veya INSERT eylemlerini test etme

Belirli sütunları temel alan UPDATE veya INSERT belirli sütunlarda yapılan değişiklikleri yapmak için bir Transact-SQL tetikleyicisi tasarlayabilirsiniz. Bu amaçla tetikleyici gövdesinde UPDATE veya COLUMNS_UPDATED kullanın. UPDATE() bir sütun için UPDATEINSERT test veya denemeler. COLUMNS_UPDATEDveya UPDATE birden çok sütunda çalışan eylemler için INSERT test etme. Bu işlev, hangi sütunların eklendiğini veya güncelleştirildiğini gösteren bir bit deseni döndürür.

Tetikleyici sınırlamaları

CREATE TRIGGER toplu iş içindeki ilk deyim olmalıdır ve yalnızca bir tabloya uygulanabilir.

Tetikleyici yalnızca geçerli veritabanında oluşturulur; ancak, tetikleyici geçerli veritabanının dışındaki nesnelere başvurabilir.

Tetikleyici şema adı tetikleyiciyi niteleecek şekilde belirtilirse, tablo adını da aynı şekilde niteleyin.

Aynı tetikleyici eylemi, aynı INSERT deyimde birden fazla kullanıcı eylemi (örneğin ve UPDATECREATE TRIGGER) için tanımlanabilir.

INSTEAD OF DELETE / INSTEAD OF UPDATE tetikleyicileri, eylem üzerinde art arda DELETE/UPDATE tanımlanmış yabancı anahtara sahip bir tabloda tanımlanamaz.

Herhangi bir SET deyimi tetikleyici içinde belirtilebilir. Seçilen SET seçeneği tetikleyicinin yürütülmesi sırasında etkin kalır ve ardından önceki ayarına geri döner.

Tetikleyici tetiklendiğinde, arama uygulamasına, saklı yordamlarda olduğu gibi sonuçlar döndürülür. Tetikleyici tetiklenmesi nedeniyle bir uygulamaya sonuçların döndürülmesini önlemek için, sonuçları döndüren deyimleri veya tetikleyicide değişken ataması gerçekleştiren deyimleri eklemeyin SELECT . Kullanıcıya sonuç döndüren deyimleri veya değişken ataması yapılan deyimleri içeren SELECT bir tetikleyici, özel işleme gerektirir. Döndürülen sonuçları tetikleyici tablosunda yapılan değişikliklere izin verilen her uygulamaya yazmanız gerekir. Değişken atamasının bir tetikleyicide gerçekleşmesi gerekiyorsa, herhangi bir sonuç kümesinin döndürülmesini önlemek için tetikleyicinin başındaki bir SET NOCOUNT deyimi kullanın.

Deyim TRUNCATE TABLE etkin DELETE olsa da, işlem tek tek satır silmeleri günlüğe kaydetmediğinden tetikleyiciyi etkinleştirmez. Ancak, yalnızca bir TRUNCATE TABLE deyimi çalıştırma izni olan kullanıcıların yanlışlıkla tetikleyiciyi bu şekilde atlatma DELETE konusunda endişelenmeleri gerekir.

İster WRITETEXT günlüğe kaydedilen ister kaydedilmemiş deyimi bir tetikleyiciyi etkinleştirmez.

DML tetikleyicisinde aşağıdaki Transact-SQL deyimlerine izin verilmez:

  • ALTER DATABASE
  • CREATE DATABASE
  • DROP DATABASE
  • RESTORE DATABASE
  • RESTORE LOG
  • RECONFIGURE

Ayrıca, aşağıdaki Transact-SQL deyimlerine tetikleyici eyleminin hedefi olan tablo veya görünümde kullanıldığında DML tetikleyicisinin gövdesinde izin verilmez.

  • CREATE INDEX(ve CREATE SPATIAL INDEXdahilCREATE XML INDEX)
  • ALTER INDEX
  • DROP INDEX
  • DROP TABLE
  • DBCC DBREINDEX
  • ALTER PARTITION FUNCTION
  • ALTER TABLE aşağıdaki eylemleri yapmak için kullanıldığında:
    • Sütun ekleme, değiştirme veya bırakma.
    • Bölümleri değiştirme.
    • Ekleme veya bırakma PRIMARY KEY veya UNIQUE kısıtlamalar.

Uyarı

SQL Server sistem tablolarında kullanıcı tanımlı tetikleyicileri desteklemediğinden, sistem tablolarında kullanıcı tanımlı tetikleyiciler oluşturmamanızı öneririz.

DML tetikleyicilerini iyileştirme

Tetikleyiciler işlemlerde (örtük veya başka bir şekilde) çalışır ve açıkken kaynakları kilitler. kilit, işlem onaylanana (ile COMMIT) veya reddedilene (bir ROLLBACKile) kadar yerinde kalır. Tetikleyici ne kadar uzun süre çalışırsa, başka bir işlemin engellenme olasılığı o kadar yüksek olur. Bu nedenle, mümkün olduğunda sürelerini azaltacak tetikleyiciler yazın. Daha kısa süre elde etmenin bir yolu, DML deyimi sıfır satır değiştirdiğinde tetikleyiciyi serbest bırakmaktır.

Herhangi bir satırı değiştirmeyen bir komutun tetikleyicisini serbest bırakmak için ROWCOUNT_BIG sistem değişkenini kullanın.

Aşağıdaki T-SQL kod parçacığı, hiçbir satırı değiştirmeyen bir komut için tetikleyicinin nasıl serbest bırakıldığını gösterir. Bu kod her DML tetikleyicisinin başında bulunmalıdır:

IF (ROWCOUNT_BIG() = 0)
RETURN;

DDL tetikleyicileri için açıklamalar

Standart tetikleyiciler gibi DDL tetikleyicileri, bir olaya yanıt olarak saklı yordamları başlatır. Ancak standart tetikleyicilerden farklı olarak, bir tablo veya görünümde , UPDATEveya INSERT deyimlerine yanıt olarak DELETEçalışmazlar. Bunun yerine, birincil olarak veri tanımı dili (DDL) deyimlerine yanıt olarak çalışır. Deyim türleri , , CREATE, ALTER, DROP, GRANT, DENYve REVOKEtürlerini içerirUPDATE STATISTICS. DDL benzeri işlemler gerçekleştiren bazı sistem saklı yordamları da DDL tetikleyicilerini tetikleyebilir.

Önemli

Sistem saklı yordamı yürütme yanıtlarını belirlemek için DDL tetikleyicilerinizi test edin. Örneğin, CREATE TYPE deyimi ve sp_addtype ve sp_rename saklı yordamları bir olayda CREATE_TYPE oluşturulan bir DDL tetikleyicisini tetikler.

DDL tetikleyicileri hakkında daha fazla bilgi için bkz. DDL tetikleyicileri.

DDL tetikleyicileri, yerel veya genel geçici tabloları ve saklı yordamları etkileyen olaylara yanıt olarak tetiklemez.

DML tetikleyicilerinden farklı olarak, DDL tetikleyicilerinin kapsamı şemalara yönelik değildir. Bu nedenle, DDL tetikleyicileri hakkındaki meta verileri sorgulamak için , OBJECT_ID, OBJECT_NAMEve OBJECTPROPERTY gibi OBJECTPROPERTYEXişlevleri kullanamazsınız. Bunun yerine katalog görünümlerini kullanın. Daha fazla bilgi için bkz. DDL Tetikleyicileri Hakkında Bilgi Alma.

Uyarı

Sunucu kapsamlı DDL tetikleyicileri , Tetikleyiciler klasöründeki SQL Server Management Studio Nesne Gezgini'nde görünür. Bu klasör , Sunucu Nesneleri klasörünün altında bulunur. Veritabanı kapsamlı DDL tetikleyicileri , Veritabanı Tetikleyicileri klasöründe görünür. Bu klasör, ilgili veritabanının Programlanabilirlik klasörünün altında bulunur.

Oturum açma tetikleyicileri

Oturum açma tetikleyicileri, bir LOGON olaya yanıt olarak saklı yordamlar gerçekleştirir. Bu olay, SQL Server örneğiyle bir kullanıcı oturumu oluşturulduğunda gerçekleşir. Oturum açma tetikleyicileri, oturum açma işleminin kimlik doğrulama aşaması tamamlandıktan sonra ancak kullanıcı oturumu oluşturulmadan önce tetiklenir. Bu nedenle, tetikleyicinin içinden gelen ve genellikle kullanıcıya ulaşabilecek hata iletileri ve deyiminden gelen PRINT iletiler gibi tüm iletiler SQL Server hata günlüğüne yönlendirilir. Daha fazla bilgi için bkz . Oturum açma tetikleyicileri.

Kimlik doğrulaması başarısız olursa oturum açma tetikleyicileri tetiklenmiyor.

Dağıtılmış işlemler oturum açma tetikleyicisinde desteklenmez. Hata 3969, dağıtılmış işlem içeren bir oturum açma tetikleyicisi tetiklendiğinde döndürülüyor.

Oturum açma tetikleyicisini devre dışı bırakma

Oturum açma tetikleyicisi, sysadmin sabit sunucu rolünün üyeleri de dahil olmak üzere tüm kullanıcılar için Veritabanı Altyapısı'na başarılı bağlantıları etkili bir şekilde engelleyebilir. Bir oturum açma tetikleyicisi bağlantıları engelliyorsa, sysadmin sabit sunucu rolünün üyeleri ayrılmış yönetici bağlantısını kullanarak veya Veritabanı Altyapısı'nı en düşük yapılandırma modunda (-f ) başlatarak bağlanabilir. Daha fazla bilgi için bkz. Veritabanı Altyapısı Hizmeti başlangıç seçenekleri.

Genel tetikleyiciyle ilgili dikkat edilmesi gerekenler

Sonuçları döndür

Tetikleyicilerden sonuç döndürme özelliği, SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Sonuç kümeleri döndüren tetikleyiciler, bunlarla çalışmak üzere tasarlanmamış uygulamalarda beklenmeyen davranışlara neden olabilir. Yeni geliştirme çalışmalarındaki tetikleyicilerden sonuç kümelerini döndürmekten kaçının ve şu anda bunu yapan uygulamaları değiştirmeyi planlayın. Tetikleyicilerin sonuç kümelerini döndürmesini önlemek için tetikleyicilerden gelen sonuçlara izin verme seçeneğini 1 olarak ayarlayın.

Oturum açma tetikleyicileri her zaman sonuç kümelerinin döndürülmesine izin vermiyor ve bu davranış yapılandırılamaz. Oturum açma tetikleyicisi bir sonuç kümesi oluşturursa tetikleyici başlatılamaz ve tetikleyiciyi tetikleyen oturum açma girişimi reddedilir.

Birden çok tetikleyici

SQL Server, her DML, DDL veya LOGON olay için birden çok tetikleyici oluşturmanıza olanak tanır. Örneğin, zaten tetikleyicisi olan CREATE TRIGGER FOR UPDATE bir tablo için çalıştırılırsa UPDATE ek bir güncelleştirme tetikleyicisi oluşturulur. SQL Server'ın önceki sürümlerinde, her tablo için her INSERT, UPDATEveya DELETE veri değiştirme olayı için yalnızca bir tetikleyiciye izin verilir.

Özyinelemeli tetikleyiciler

SQL Server, ayarı kullanılarak RECURSIVE_TRIGGERSetkinleştirildiğinde ALTER DATABASE tetikleyicilerin özyinelemeli çağrılmasına da destek sağlar.

Özyinelemeli tetikleyiciler aşağıdaki özyineleme türlerinin oluşmasını sağlar:

  • Dolaylı özyineleme: Dolaylı özyineleme ile, uygulama tablosunu T1güncelleştirir. Bu tetikleyiciyi TR1tetikler, tablo T2güncelleştiriliyor. Tetikleyici T2 daha sonra tablosunu T1tetikler ve güncelleştirir.

  • Doğrudan özyineleme: Doğrudan özyinelemede uygulama tablosunu T1güncelleştirir. Bu tetikleyiciyi TR1tetikler, tablo T1güncelleştiriliyor. Tablo T1 güncelleştirildiğinden tetikleyici TR1 yeniden tetikler ve bu şekilde devam eder.

Aşağıdaki örnekte hem dolaylı hem de doğrudan tetikleyici özyinelemesi kullanılır. İki güncelleştirme tetikleyicisinin TR1 ve TR2öğesinin tablosunda T1tanımlandığını varsayalım. Güncelleştirme tablosunu TR1 yinelemeli olarak tetiklemeT1. Bir UPDATE deyim her TR1 biri ve TR2 bir kez çalışır. Ayrıca, başlatma işlemi TR1 (özyinelemeli olarak) ve TR1yürütmesini TR2 tetikler. Belirli bir tetikleyici için eklenen ve silinen tablolar yalnızca tetikleyiciyi UPDATE çağıran deyime karşılık gelen satırlar içerir.

Uyarı

Önceki davranış yalnızca RECURSIVE_TRIGGERS ayarı kullanılarak ALTER DATABASEetkinleştirildiğinde oluşur. Belirli bir olay için tanımlanan birden çok tetikleyicinin çalıştırıldığı tanımlı bir sıra yoktur. Her tetikleyici kendi içinde olmalıdır.

Ayarın RECURSIVE_TRIGGERS devre dışı bırakılması yalnızca doğrudan özyinelemeleri engeller. Dolaylı özyineleme özelliğini de devre dışı bırakmak için kullanarak sp_configureiç içe tetikleyiciler sunucusu seçeneğini 0 olarak ayarlayın.

Tetikleyicilerden herhangi biri iç içe yerleştirme düzeyinden bağımsız olarak bir ROLLBACK TRANSACTIONyürütürse, başka tetikleyici çalıştırılır.

İç içe tetikleyiciler

Tetikleyicileri en fazla 32 düzeye iç içe yerleştirebilirsiniz. Tetikleyici, başka bir tetikleyicinin bulunduğu tabloyu değiştirirse, ikinci tetikleyici etkinleştirilir ve ardından üçüncü tetikleyiciyi çağırabilir ve bu şekilde devam eder. Zincirdeki herhangi bir tetikleyici sonsuz döngü başlatırsa, iç içe geçme düzeyi aşılır ve tetikleyici iptal edilir. bir Transact-SQL tetikleyicisi bir CLR yordamına, türüne veya toplamasına başvurarak yönetilen kodu başlattığında, bu başvuru 32 düzeyli iç içe geçme sınırına karşı bir düzey olarak sayılır. Yönetilen kodun içinden çağrılan yöntemler bu sınıra karşı sayılmaz.

İç içe tetikleyicileri devre dışı bırakmak için iç içe tetikleyiciler seçeneğini sp_configure 0 (kapalı) olarak ayarlayın. Varsayılan yapılandırma iç içe tetikleyicileri destekler. İç içe tetikleyiciler kapalıysa, kullanılarak RECURSIVE_TRIGGERSayarlanan ayara ALTER DATABASE rağmen özyinelemeli tetikleyiciler de devre dışı bırakılır.

bir tetikleyicinin içine AFTER yerleştirilmiş ilk INSTEAD OF tetikleyici, iç içe tetikleyiciler sunucu yapılandırma seçeneği 0 olsa bile tetikler. Ancak, bu ayar altında sonraki AFTER tetikleyiciler tetiklenmiyor. İç içe tetikleyiciler sunucu yapılandırma seçeneği 0 olarak ayarlandığında uygulamaların iş kurallarınıza uyup uymadığını belirlemek için uygulamalarınızı iç içe tetikleyiciler için gözden geçirin. Aksi takdirde, uygun değişiklikleri yapın.

Ertelenmiş ad çözümlemesi

SQL Server, derleme zamanında var olmayan tablolara başvurmak için saklı yordamların, tetikleyicilerin, işlevlerin ve toplu işlemlerin Transact-SQL olanak tanır. Bu özellik ertelenen ad çözümleme olarak adlandırılır.

İzinler

DML tetikleyicisi oluşturmak için, tetikleyicinin oluşturulduğu tabloda veya görünümde izin gerektirir ALTER .

Sunucu kapsamı (ON ALL SERVER) veya oturum açma tetikleyicisi ile DDL tetikleyicisi oluşturmak için sunucuda izin gerekir CONTROL SERVER . Veritabanı kapsamıON DATABASE () ile bir DDL tetikleyicisi oluşturmak için geçerli veritabanında izin gerekir ALTER ANY DATABASE DDL TRIGGER .

Örnekler

A. Anımsatıcı iletisiyle DML tetikleyicisi kullanma

Aşağıdaki DML tetikleyicisi, AdventureWorks2025 veritabanındaki tabloya veri eklemeye veya değiştirmeye Customer çalışan biri olduğunda istemciye mesaj yazdırır.

CREATE TRIGGER reminder1
ON Sales.Customer
AFTER INSERT, UPDATE
AS RAISERROR ('Notify Customer Relations', 16, 10);
GO

B. Anımsatıcı e-posta iletisiyle DML tetikleyicisi kullanma

Aşağıdaki örnek, tablo değiştiğinde MaryM belirtilen kişiye (Customer) bir e-posta iletisi gönderir.

CREATE TRIGGER reminder2
ON Sales.Customer
AFTER INSERT, UPDATE, DELETE
AS
    EXECUTE msdb.dbo.sp_send_dbmail
        @profile_name = 'AdventureWorks2022 Administrator',
        @recipients = 'danw@Adventure-Works.com',
        @body = 'Don''t forget to print a report for the sales force.',
        @subject = 'Reminder';
GO

C. PurchaseOrderHeader ve Vendor tabloları arasında bir iş kuralı zorlamak için DML AFTER tetikleyicisi kullanma

CHECK Kısıtlamalar yalnızca sütun düzeyi veya tablo düzeyi kısıtlamasının tanımlandığı sütunlara başvuracağından, tetikleyici olarak tablolar arası kısıtlamalar (bu örnekte iş kuralları) tanımlamanız gerekir.

Aşağıdaki örnek veritabanında bir DML tetikleyicisi AdventureWorks2025 oluşturur. Bu tetikleyici, tabloya yeni bir satınalma siparişi PurchaseOrderHeader ekleme girişimi olduğunda satıcının kredi derecelendirmesinin iyi (5 değil) olduğundan emin olmak için denetler. Satıcının kredi derecelendirmesini almak için tabloya Vendor başvurulmalıdır. Kredi derecelendirmesi çok düşükse bir ileti görüntülenir ve ekleme gerçekleşmez.

USE AdventureWorks2022;
GO

IF OBJECT_ID('Purchasing.LowCredit', 'TR') IS NOT NULL
    DROP TRIGGER Purchasing.LowCredit;
GO

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader table
-- when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit
ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
    IF (ROWCOUNT_BIG() = 0)
    RETURN;
    IF EXISTS (SELECT 1
        FROM inserted AS i
        INNER JOIN Purchasing.Vendor AS v
            ON v.BusinessEntityID = i.VendorID
            WHERE v.CreditRating = 5)
BEGIN
    RAISERROR ('A vendor''s credit rating is too low to accept new purchase orders.', 16, 1);
    ROLLBACK;
    RETURN;
END
GO

-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  

INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
    VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES (2, 3, 261, 1652, 4, GETDATE(), GETDATE(), 44594.55, 3567.564, 1114.8638);
GO

D. Veritabanı kapsamlı DDL tetikleyicisi kullanma

Aşağıdaki örnek, veritabanındaki tüm eş anlamlıların bırakılmasını önlemek için bir DDL tetikleyicisi kullanır.

CREATE TRIGGER safety
    ON DATABASE
    FOR DROP_SYNONYM
    AS IF (@@ROWCOUNT = 0)
           RETURN;
       RAISERROR ('You must disable Trigger "safety" to remove synonyms!', 10, 1);
       ROLLBACK;
GO

DROP TRIGGER safety
    ON DATABASE;
GO

E. Sunucu kapsamlı DDL tetikleyicisi kullanma

Aşağıdaki örnek, geçerli sunucu örneğinde herhangi CREATE DATABASE bir olay oluşursa bir iletiyi yazdırmak için bir DDL tetikleyicisi kullanır ve ilgili Transact-SQL deyiminin metnini almak için işlevini kullanır EVENTDATA . DDL tetikleyicilerinde kullanılan EVENTDATA diğer örnekler için bkz. EVENTDATA İşlevini Kullanma.

CREATE TRIGGER ddl_trig_database
    ON ALL SERVER
    FOR CREATE_DATABASE
    AS PRINT 'Database Created.';
       SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)');
GO

DROP TRIGGER ddl_trig_database
    ON ALL SERVER;
GO

F. Oturum açma tetikleyicisi kullanma

Aşağıdaki oturum açma tetikleyicisi örneği, söz konusu oturum açma işleminin altında çalışan üç kullanıcı oturumu varsa SQL Server'da oturum açma girişimini login_test reddeder. Güçlü bir parolaya geçin <password> .

USE master;
GO

CREATE LOGIN login_test
    WITH PASSWORD = '<password>' MUST_CHANGE, CHECK_EXPIRATION = ON;
GO

GRANT VIEW SERVER STATE TO login_test;
GO

CREATE TRIGGER connection_limit_trigger
    ON ALL SERVER
    WITH EXECUTE AS 'login_test'
    FOR LOGON
    AS BEGIN
           IF ORIGINAL_LOGIN() = 'login_test'
              AND (SELECT COUNT(*)
                   FROM sys.dm_exec_sessions
                   WHERE is_user_process = 1
                         AND original_login_name = 'login_test') > 3
               ROLLBACK;
       END

G. Tetikleyicinin tetiklenmelerine neden olan olayları görüntüleme

Aşağıdaki örnek, hangi Transact-SQL dil olaylarının tetikleyicinin sys.triggers tetiklendiğine sys.trigger_events karar vermek için ve safety katalog görünümlerini sorgular. tetikleyicisi, safetyD örneğinde oluşturulur . Veritabanı kapsamlı bir DDL tetikleyicisi kullanın.

SELECT TE.*
FROM sys.trigger_events AS TE
     INNER JOIN sys.triggers AS T
         ON T.object_id = TE.object_id
WHERE T.parent_class = 0
      AND T.name = 'safety';
GO