CREATE TRIGGER (Transact-SQL)

SQL Server 2012'da bir DML, DDL veya oturum açma tetikleyicisi oluşturur. Tetikleyici, veritabanı sunucusunda bir olay oluştuğunda otomatik olarak çalışan özel bir tür saklı yordamdır. DML tetikleyicileri, bir kullanıcı bir veri işleme dili (DML) olayı üzerinden verileri değiştirmeye çalıştığında çalışır. DML olayları bir tablo veya görünümde yürütülen INSERT, UPDATE veya DELETE deyimleridir. Bu tetikleyiciler geçerli herhangi bir olay çalıştırıldığında, herhangi bir tablo satırının etkilenip etkilenmediğine bakmaksızın çalışır. Daha fazla bilgi için, bkz. dml Tetikleyicileri.

DDL tetikleyicileri çeşitli veri tanımlama dili (DDL) olaylarına yanıt olarak çalışır. Bu olaylar birincil olarak Transact-SQL CREATE, ALTER ve DROP deyimlerine ve DDL benzeri işlemler gerçekleştiren bazı sistem saklı yordamlarına karşılık gelir. Oturum açma tetikleyicileri bir kullanıcı oturumu kurulurken oluşturulan LOGON olayına yanıt olarak çalışır. Tetikleyiciler doğrudan Transact-SQL deyimlerinden veya Microsoft .NET Framework ortak dil çalışma zamanında (CLR) oluşturulan ve bir SQL Server örneğine yüklenen derlemelerin yöntemlerinden oluşturulabilir. SQL Server, herhangi bir deyim için birden çok tetikleyici oluşturmaya izin verir.

Güvenlik notuGüvenlik Notu

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

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)
CREATE TRIGGER [ schema_name . ]trigger_name 
ON { table | view } 
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF } 
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } 
[ 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 a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE STATISTICS statement (DDL Trigger)
CREATE 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 ]

Trigger on a LOGON event (Logon Trigger)
CREATE 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 ]

Bağımsız değişkenler

  • schema_name
    DML tetikleyicisinin ait olduğu şemanın adıdır. DML tetikleyicileri, üzerinde oluşturuldukları tablo veya görünümün şemasının kapsamıyla sınırlıdır. schema_name DDL veya oturum açma tetikleyicileri için belirtilemez.

  • trigger_name
    Tetikleyicinin adıdır. Bir trigger_name, trigger_name ifadesinin # veya ## ile başlayamayacağı dışında tanımlayıcılar için geçerli olan kurallara uymalıdır.

  • table | view
    DML tetikleyicisinin yürütüldüğü tablo veya görünümdür ve bazen tetikleyici tablosu veya tetikleyici görünümü olarak da anılır. Tablo veya görünümün tam adını belirtmek isteğe bağlıdır. Bir görünüme yalnızca bir INSTEAD OF tetikleyicisi ile başvurulabilir. DML tetikleyicileri yerel veya küresel geçici tablolar üzerinde tanımlanamaz.

  • DATABASE
    Bir DDL tetikleyicisinin kapsamını geçerli veritabanına uygular. Belirtilirse, geçerli veritabanında event_type veya event_group oluştuğunda tetikleyici çalışır.

  • ALL SERVER
    Bir DDL'nin kapsamını veya oturum açma tetikleyicisini geçerli sunucuya uygular. Belirtilirse, geçerli sunucuda herhangi bir noktada event_type veya event_group oluştuğunda tetikleyici çalışır.

  • WITH ENCRYPTION
    CREATE TRIGGER deyiminin metnini karartır. WITH ENCRYPTION'ın kullanılması, tetikleyicinin SQL Server çoğaltmasının parçası olarak yayımlanmasını önler. WITH ENCRYPTION, CLR tetikleyicileri için belirtilemez.

  • EXECUTE AS
    Tetikleyicinin kapsamında yürütüldüğü güvenlik bağlamını belirtir. SQL Server örneğinin, tetikleyicinin başvurduğu herhangi bir veritabanı nesnesinin izinlerini doğrulamak için hangi kullanıcı hesabı kullandığını denetlemenizi sağlar.

    Daha fazla bilgi için, bkz.execute as yan tümcesi (Transact-sql).

  • FOR | AFTER
    AFTER, DML tetikleyicisinin yalnızca tetikleyen SQL deyiminde belirtilen tüm işlemler başarıyla çalıştığında yürütüldüğünü belirtir. Bu tetikleyicinin çalışması için başvurulan tüm basamaklı eylemlerin ve kısıtlama denetimlerinin de ayrıca başarılı olması gerekir.

    Belirtilen tek anahtar sözcük FOR olduğunda AFTER varsayılandır.

    AFTER tetikleyicileri görünümlerde tanımlanamaz.

  • INSTEAD OF
    DML tetikleyicisinin tetikleyen SQL deyimi yerine çalıştırıldığını, dolayısıyla tetikleyen deyimlerin eylemlerini geçersiz kıldığını belirtir. INSTEAD OF, DDL veya oturum açma tetikleyicileri için belirtilemez.

    Bir tablo veya görünümde INSERT, UPDATE veya DELETE deyimi başına en çok bir INSTEAD OF tetikleyicisi tanımlanabilir. Ancak, her görünümün kendi INSTEAD OF tetikleyicisine sahip olduğu görünümler üzerinde görünümler tanımlayabilirsiniz.

    INSTEAD OF tetikleyicileri, WITH CHECK OPTION kullanan güncelleştirilebilir görünümlerde kullanılamaz. INSTEAD OF tetikleyicisi WITH CHECK OPTION belirtilmiş güncelleştirilebilir bir görünüme eklendiğinde, SQL Server bir hata oluşturur. Kullanıcının, INSTEAD OF tetikleyicisini tanımlamadan önce bu seçeneği ALTER VIEW kullanarak kaldırması gerekir.

  • { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
    Bu tablo veya görünümde denendiğinde DML tetikleyicisini etkinleştiren veri değiştirme deyimlerini belirtir. En az bir seçenek belirtilmesi gerekir. Bu seçeneklerin herhangi biri herhangi bir sırada tetikleyici tanımında kullanılabilir.

    INSTEAD OF tetikleyicilerinde, DELETE seçeneği, ON DELETE'te bir basamaklı eylem belirten bir başvuru ilişkisi olan tablolarda kullanılamaz. Benzer şekilde, UPDATE seçeneği, ON UPDATE'te bir basamaklı eylem belirten bir başvuru ilişkisi olan tablolarda kullanılamaz.

  • event_type
    Oluştuktan sonra bir DDL tetikleyicisinin çalışmasına neden olan bir Transact-SQL dili olayının adıdır. DDL tetikleyicileri için geçerli olaylar ddl olayları içinde listelenmiştir.

  • event_group
    Transact-SQL dili olaylarının önceden tanımlı bir gruplamasının adıdır. DDL tetikleyicisi, event_group grubuna ait olan herhangi bir Transact-SQL dili olayı çalıştıktan sonra çalışır. DDL tetikleyicileri için geçerli olay grupları ddl olay grupları içinde listelenmiştir.

    CREATE TRIGGER çalışmasını tamamladıktan sonra event_group, ayrıca, kapsadığı olay türlerini sys.trigger_events katalog görünümüne ekleyerek bir makro görevi görür.

  • NOT FOR REPLICATION
    Bir çoğaltma aracısı tetikleyicide kullanılan tabloyu değiştirdiğinde, tetikleyicinin çalıştırılmaması gerektiğini gösterir.

  • sql_statement
    Tetikleyici koşulları ve eylemleridir. Tetikleyici koşulları, denenen DML, DDL ve oturum açma olaylarının tetikleyici eylemlerinin gerçekleştirilmesine neden olup olmadığını belirleyen ek ölçütleri belirtir.

    Transact-SQL deyimlerinde belirtilen tetikleyici eylemleri işlem denendiğinde devreye girer.

    Tetikleyiciler, bazıları dışında herhangi bir sayıda ve türde Transact-SQL deyimi içerebilir. Daha fazla bilgi için, Yorumlar'a bakın. Bir tetikleyici, bir veri değiştirme veya tanımlama deyimine bağlı olarak verileri denetlemek veya değiştirmek üzere tasarlanmıştır; kullanıcıya veri döndürmemesi gerekir. Bir tetikleyicideki Transact-SQL deyimleri sık sık akış denetimi dili içerir.

    DML tetikleyicileri deleted ve inserted mantıksal (kavramsal) tablolarını kullanır. Bunlar genellikle tetikleyicinin üzerinde tanımlandığı, yani kullanıcı eyleminin denendiği tabloya benzer. deleted ve inserted tabloları, kullanıcı eylemi tarafından değiştirilebilecek satırların eski değerlerini veya yeni değerlerini tutar. Örneğin, deleted tablosundaki tüm değerleri almak için, şunu kullanın:

    SELECT * FROM deleted
    
    SELECT * FROM deleted
    

    Daha fazla bilgi için, bkz. Eklenen ve silinen tabloları kullanın.

    DDL ve oturum açma tetikleyicileri, eventdata (Transact-sql) işlevini kullanarak tetikleyici olay hakkında bilgi yakalar. Daha fazla bilgi için, bkz. eventdata işlevini kullanma.

    SQL Server text, ntext veya image sütunlarının tablo veya görünümler üzerindeki INSTEAD OF tetikleyicisi üzerinden güncelleştirilmesine izin verir.

    Önemli notÖnemli

    ntext, text ve image veri türleri gelecek bir Microsoft SQL Server sürümünde kaldırılacaktır. Yeni geliştirme işlerinde bu veri türlerini kullanmaktan kaçının ve bunları kullanmakta olan uygulamaları değiştirmek için plan yapın. Bunların yerine nvarchar(max), varchar(max) ve varbinary(max) kullanın. Gerek AFTER gerekse INSTEAD OF tetikleyicileri, inserted ve deleted tablolarındaki varchar(MAX), nvarchar(MAX) ve varbinary(MAX) verilerini destekler.

  • < yöntem_belirtici >
    Bir CLR tetikleyicisinde, bir derlemenin tetikleyiciye bağlanacak yöntemini belirtir. Yöntemin hiçbir bağımsız değişken almaması ve void döndürmesi gerekir. class_name geçerli bir SQL Server tanımlayıcısı olması ve derlemede derleme düzeyinde görünür olan bir sınıf olarak var olması gerekir. Sınıfın ad alanlarını ayırmak için '.' kullanan ad alanıyla nitelenmiş bir adı varsa, sınıf adının [ ] veya " " sınırlayıcıları kullanılarak sınırlanması gerekir. Sınıf iç içe geçmiş bir sınıf olamaz.

    [!NOT]

    Varsayılan olarak SQL Server'ın CLR kodu çalıştırma yeteneği kapalıdır. Yönetilen kod modüllerine başvuran veritabanı nesneleri oluşturabilir, bunları değiştirebilir veya bırakabilirsiniz, ancak bu başvurular, CLR Etkin Seçeneği sp_configure kullanılarak etkinleştirilmedikçe bir SQL Server örneğinde çalışmaz.

Açıklamalar

DML Tetikleyicileri

DML tetikleyicileri sık sık iş kurallarını veya veri bütünlüğünü zorlamak için kullanılır. SQL Server, ALTER TABLE ve CREATE TABLE deyimleri yoluyla bildirim temelli bilgi tutarlılığı (DRI) sağlar. Ancak, DRI tablolar arası başvuru bütünlüğü sağlamaz. Başvuru bütünlüğü, tabloların birincil ve yabancı anahtarları arasındaki ilişkiyle ilgili kuralları anlatır. Başvuru bütünlüğünü zorlamak için, ALTER TABLE ve CREATE TABLE deyimlerinde PRIMARY KEY ve FOREIGN KEY kısıtlamalarını kullanın. Tetikleyici tablosunda kısıtlamalar varsa, bunlar INSTEAD OF tetikleyicisinin çalıştırılmasından sonra ve AFTER tetikleyicisi çalıştırılmadan önce denetlenir. Kısıtlamalar ihlal edilirse, INSTEAD OF tetikleyici eylemleri geri alınır ve AFTER tetikleyicisi çalıştırılmaz.

Bir tabloda çalıştırılacak ilk ve son AFTER tetikleyicileri sp_settriggerorder kullanılarak belirtilebilir. Bir tabloda her INSERT, UPDATE ve DELETE işlemi için yalnızca bir ilk ve bir son AFTER tetikleyicisi belirtilebilir. Aynı tabloda başka AFTER tetikleyicileri varsa, bunlar rastgele çalıştırılır.

Bir ALTER TRIGGER deyimi bir ilk veya son tetikleyiciyi değiştirirse, değiştirilen tetikleyicide ayarlanan ilk veya son öznitelik bırakılır ve sıra değerinin sp_settriggerorder kullanılarak sıfırlanması gerekir.

Bir AFTER tetikleyicisi yalnızca tetikleyen SQL deyimi başarıyla yürütüldükten sonra çalıştırılır. Bu başarılı çalıştırma, güncelleştirilen veya silinen nesne ile ilişkili tüm basamaklı başvuru eylemlerini ve kısıtlama denetimlerini içerir.

Bir tabloda tanımlı bir INSTEAD OF tetikleyicisi tablo üzerinde normalde INSTEAD OF tetikleyicisini yeniden çalıştıracak bir deyim çalıştırırsa, tetikleyici özyineleme ile çalıştırılmaz. Bunun yerine deyim, tablonun hiçbir INSTEAD OF tetikleyicisi yokmuş gibi çalıştırılır ve kısıtlama işlemleri zincirini ve AFTER tetikleyici yürütmelerini başlatır. Örneğin, bir tetikleyici bir tablonun INSTEAD OF INSERT tetikleyicisi olarak tanımlandıysa ve tetikleyici tabloda bir INSERT deyimi yürütürse, INSTEAD OF tetikleyicisi tarafından yürütülen INSERT deyimi tetikleyiciyi yeniden çağırmaz. Tetikleyicinin yürüttüğü INSERT kısıtlama eylemlerini gerçekleştirme ve varsa tablo için tanımlanmış AFTER INSERT tetikleyicilerini yürütme sürecini başlatır.

Bir görünümde tanımlı bir INSTEAD OF tetikleyicisi görünüm üzerinde normalde INSTEAD OF tetikleyicisini yeniden çalıştıracak bir deyim çalıştırırsa, tetikleyici özyineleme ile çalıştırılmaz. Bunun yerine deyim, görünümün dayandığı taban tabloda değişiklikler olarak çözümlenir. Bu durumda, görünüm tanımının güncelleştirilebilir bir görünüm tüm kısıtlamalarını karşılaması gerekir. Güncelleştirilebilir görünümlerin bir tanımı için, bkz. Bir görünüm üzerinden veri değiştirme.

Örneğin, bir tetikleyici bir görünümün INSTEAD OF UPDATE tetikleyicisi olarak tanımlandıysa ve tetikleyici aynı görünüme başvuran bir UPDATE deyimi yürütürse, INSTEAD OF tetikleyicisi tarafından yürütülen UPDATE deyimi tetikleyiciyi yeniden çağırmaz. Tetikleyicinin yürüttüğü UPDATE, görünüm üzerinde, görünümün bir INSTEAD OF tetikleyicisi yokmuş gibi işlenir. UPDATE tarafından değiştirilen sütunların tek bir taban tabloya çözümlenmesi gerekir. Alttaki taban tabloda yapılan her değişiklik kısıtlama uygulama ve tablo için tanımlanmış AFTER tetikleyicilerini çalıştırma zincirini başlatır.

Belirli Sütunlarda UPDATE veya INSERT Eylemleri için Sınama

Belirli sütunlarda yapılan UPDATE veya INSERT değişikliklerine göre belirli eylemleri gerçekleştirmek için bir Transact-SQL tetikleyicisi tasarlayabilirsiniz. Bunun için tetikleyicinin gövdesinde UPDATE() veya COLUMNS_UPDATED kullanın. UPDATE(), tek bir sütunda UPDATE veya INSERT denemelerini sınar. COLUMNS_UPDATED, birden çok sütunda gerçekleştirilen UPDATE veya INSERT eylemlerini sınar ve 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 bir işin ilk deyimi olmalıdır ve yalnızca bir tabloya uygulanabilir.

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

Tetikleyiciyi nitelemek için tetikleyici şema adı kullanılırsa, tablo adını da aynı şekilde niteleyin.

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

INSTEAD OF DELETE/UPDATE tetikleyicileri, tanımlı basamaklı bir ON DELETE/UPDATE eylemi olan yabancı anahtarlı bir tabloda tanımlanamaz.

Bir tetikleyicinin içinde herhangi bir SET deyimi belirtilebilir. Seçilen SET seçeneği, tetikleyicinin yürütülmesi sırasında yürürlükte kalır, sonra eski ayarına geri döner.

Bir tetikleyici çalıştığında, çağıran uygulamaya, aynı saklı yordamlarda olduğu gibi sonuçlar döndürülür. Bir tetikleyicinin çalıştırılması nedeniyle bir uygulamaya sonuçlar döndürülmesini önlemek için, bir tetikleyiciye sonuç döndüren SELECT deyimleri veya bir değişkenlere atama gerçekleştiren deyimler dahil etmeyin. Kullanıcıya sonuçlar döndüren SELECT deyimleri veya değişken ataması gerçekleştiren deyimler içeren bir tetikleyicinin özel olarak işlenmesi gerekir; döndürülen bu sonuçların tetikleyici tablosunda değişiklikler yapılmasına izin veren her uygulamaya yazılması gerekir. Bir tetikleyicide değişken ataması olması gerekiyorsa, herhangi bir sonuç kümesi döndürülmesini önlemek için tetikleyicinin en başında SET NOCOUNT deyimini kullanın.

Bir TRUNCATE TABLE deyimi sonuçta bir DELETE deyimiyse de, işlem ayrı ayrı satır silmeleri günlüğe yazmadığından bir tetikleyiciyi etkinleştirmez. Ancak, yalnızca bir TRUNCATE TABLE deyimini yürütme izinleri olan kullanıcıların bir DELETE tetikleyicisini bu şekilde atlama konusunda kaygılanmaları gerekir.

WRITETEXT deyimi, günlüğe yazılsın veya yazılmasın bir tetikleyiciyi etkinleştirmez.

Aşağıdaki Transact-SQL deyimleri bir DML tetikleyicisinde kullanılamaz:

ALTER DATABASE

CREATE DATABASE

DROP DATABASE

RESTORE DATABASE

RESTORE LOG

RECONFIGURE

Ek olarak, aşağıdaki Transact-SQL deyimleri, tetikleme eyleminin hedefi olan tablo veya görünümde kullanıldığında bir DML tetikleyicisinin gövdesinde kullanılamaz.

CREATE INDEX (CREATE SPATIAL INDEX ve CREATE XML INDEX dahil)

ALTER INDEX

DROP INDEX

DBCC DBREINDEX

ALTER PARTITION FUNCTION

DROP TABLE

Aşağıdakileri yapmak için kullanıldığında ALTER TABLE:

  • Sütun ekleme, değiştirme veya bırakma.

  • Bölümler arası geçiş yapma.

  • PRIMARY KEY veya UNIQUE kısıtlamaları ekleme veya bırakma.

 

 

[!NOT]

SQL Server sistem tablolarında kullanıcı tarafından tanımlanmış tetikleyicileri desteklemediğinden, sistem tabloları üzerinde kullanıcı tarafından tanımlanmış tetikleyiciler oluşturmamanızı öneririz.

DDL Tetikleyicileri

DDL tetikleyicileri, standart tetikleyiciler gibi bir olaya yanıt olarak saklı yordamlar yürütür. Ancak standart tetikleyicilerden farklı olarak bunlar, bir tablo veya görünüm üzerindeki UPDATE, INSERT veya DELETE deyimlerine yanıt olarak çalışmazlar. Bunun yerine, asıl olarak veri tanımlama dili (DDL) deyimlerine yanıt olarak çalışırlar. Bunlar CREATE, ALTER, DROP, GRANT, DENY, REVOKE ve UPDATE STATISTICS deyimleridir. DDL benzeri işlemler gerçekleştiren bazı sistem saklı yordamları da ayrıca DDL tetikleyicilerini çalıştırabilir.

Önemli notÖnemli

Sistem saklı yordam yürütmesine yanıtlarını belirlemek için DDL tetikleyicilerinizi sınayın. Örneğin CREATE TYPE deyimi ve sp_addtype ve sp_rename saklı yordamları, bir CREATE_TYPE olayı üzerinde oluşturulmuş bir DDL tetikleyicisini çalıştırır.

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

DDL tetikleyicileri, yerel veya küresel geçici tabloları ve saklı yordamları etkileyen olaylara yanıt olarak çalışmaz.

DML tetikleyicilerinden farklı olarak DDL tetikleyicilerinin kapsamı şemalarla sınırlı değildir. Dolayısıyla OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY ve OBJECTPROPERTYEX gibi işlevler DDL tetikleyicilerinin meta verilerini sorgulamak için kullanılamaz. Bunun yerine katalog görünümlerini kullanın. Daha fazla bilgi için, bkz. dml Tetikleyiciler hakkında bilgi almak.

[!NOT]

Kapsamı sunucu olan 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, karşılık gelen veritabanının Programlanabilirlik klasörünün altında bulunur.

Oturum Açma Tetikleyicileri

Oturum açma tetikleyicileri, LOGON olayına yanıt olarak saklı yordamlar yürütür. Bu olay, bir SQL Server örneği ile bir kullanıcı oturumu kurulduğunda oluşur. Oturum açma tetikleyicileri, oturum açmanın kimlik doğrulama aşaması bittikten sonra, ancak kullanıcı oturumu gerçekten kurulmadan önce çalışır. Dolayısıyla, tetikleyiciden ortaya çıkan ve normalde kullanıcıya erişecek; hata iletileri ve PRINT deyiminden gelen iletiler gibi tüm iletiler SQL Server hata günlüğüne yönlendirilir. Daha fazla bilgi için, bkz. Oturum Açma Tetikleyicileri.

Oturum açma tetikleyicileri kimlik doğrulama başarısız olursa çalışmaz.

Dağıtılmış işlemler bir oturum açma tetikleyicisinde desteklenmez. Dağıtılmış bir işlem içeren bir oturum açma tetikleyicisi çalıştığında 3696 hatası döndürülür.

Oturum Açma Tetikleyicisini Devre Dışı Bırakma

Bir oturum açma tetikleyicisi, sysadmin sabit sunucu rolünün üyeleri dahil tüm kullanıcıların Veritabanı Altyapısı ile başarılı bağlantı kurmasını önleyebilir. Bir oturum açma tetikleyicisi bağlantıları önlüyorsa, sysadmin sabit sunucu rolünün üyeleri, adanmış yönetici bağlantısını kullanarak veya Veritabanı Altyapısı uygulamasını en düşük yapılandırma modunda (-f) başlatarak bağlanabilir. Daha fazla bilgi için, bkz. Veritabanı altyapısı hizmeti başlatma seçenekleri.

Tetikleyicilerle İlgili Genel Değerlendirmeler

Sonuç Döndürme

Tetikleyicilerden sonuç döndürme yeteneği, SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Sonuç kümeleri döndüren tetikleyiciler, bunlarla çalışacak şekilde tasarlanmamış uygulamalarda beklenmedik davranışlara yol açabilir. Yeni geliştirme işlerinde tetikleyicilerden sonuç döndürmekten kaçının ve halen bunu yapmakta olan uygulamaları değiştirmek için plan yapın. Tetikleyicilerin sonuç kümeleri döndürmesini önlemek için, tetikleyicilerden gelen sonuçlara izin verme seçeneğini 1 yapın.

Oturum açma tetikleyicileri, sonuç kümesi döndürülmesine hiçbir zaman izin vermez ve bu davranış yapılandırılamaz. Bir oturum açma tetikleyicisi bir sonuç kümesi üretirse, tetikleyici çalışamaz ve tetikleyiciyi çalıştıran oturum açma girişimi engellenir.

Birden Çok Tetikleyici

SQL Server, her DML, DDL veya LOGON olayı için birden çok tetik oluşturulmasına izin verir. Örneğin, zaten bir UPDATE tetikleyicisi olan bir tablo için CREATE TRIGGER FOR UPDATE yürütülürse, ek bir güncelleştirme tetikleyicisi oluşturulur. Daha önceki SQL Server sürümlerinde, her tabloda her INSERT, UPDATE veya DELETE veri değiştirme olayı için bir tetikleyiciye izin verilmektedir.

Özyinelemeli Tetikleyiciler

SQL Server ayrıca, RECURSIVE_TRIGGERS ayarı ALTER DATABASE kullanılarak etkinleştirildiğinde tetiklerin özyinelemeli olarak çağrılmasına izin verir.

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

  • Dolaylı özyineleme

    Dolaylı özyinelemede, bir uygulama T1 tablosunu güncelleştirir. Bu, TR1 tetikleyicisini çalıştırarak T2 tablosunu güncelleştirir. Bu senaryoda T2 tetikleyicisi daha sonra çalışır ve T1 tablosunu güncelleştirir.

  • Doğrudan özyineleme

    Doğrudan özyinelemede uygulama T1 tablosunu güncelleştirir. Bu, TR1 tetikleyicisini çalıştırarak T1 tablosunu güncelleştirir. T1 tablosu güncelleştirilmiş olduğundan TR1 tetikleyicisi yeniden çalışır ve bu böyle gider.

Aşağıdaki örnek, hem dolaylı hem de doğrudan tetikleyici özyinelemesi kullanmaktadır. TR1 ve TR2 adlı iki güncelleştirme tetikleyicisinin T1 tablosunda tanımlı olduğunu varsayın. TR1 tetikleyicisi T1 tablosunu özyinelemeli olarak güncelleştirmektedir. Bir UPDATE deyimi TR1 ve TR2 tetikleyicisini birer kez çalıştırır. Ek olarak, TR1'in çalıştırılması, (özyinelemeli olarak) TR1 ve TR2'nin çalıştırılmasını tetikler. Belirli bir tetikleyici için inserted ve deleted tabloları, yalnızca tetikleyiciyi çağıran UPDATE deyimine karşılık gelen satırlar içerir.

[!NOT]

Önceki davranış yalnızca ALTER DATABASE kullanılarak RECURSIVE_TRIGGERS ayarı etkinleştirildiğinde görülür. Belirli bir olay için tanımlanmış birden çok tetikleyicinin çalıştırılmasının tanımlı bir sırası yoktur. Her tetikleyici kendine yeterli olmalıdır.

RECURSIVE_TRIGGERS ayarını devre dışı bırakmak yalnızca doğrudan özyinelemeleri önler. Dolaylı özyinelemeyi de önlemek için, sp_configure yordamını kullanarak nested triggers sunucu seçeneğini 0'a ayarlayın.

Tetikleyicilerden herhangi biri bir ROLLBACK TRANSACTION gerçekleştirirse, iç içe geçme düzeyine bakmaksızın başka tetikleyici çalıştırılmaz.

İç İçe Tetikleyiciler

Tetikleyiciler en çok 32 düzeye kadar iç içe geçebilir. Bir tetikleyici üzerinde başka bir tetikleyici olan bir tabloyu değiştirirse, ikinci tetikleyici etkinleştirilir ve bu da üçüncü bir tetikleyiciyi çağırabilir vb. Zincirdeki herhangi bir tetikleyici sonsuz bir 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 kod yürüttüğünde, bu başvuru 32 düzeylik iç içe geçme sınırının bir düzeyi olarak sayılır. Yönetilen kodun içinden çağrılan yöntemler, bu sınır sayıdan düşülmez

İç içe geçen tetikleyicileri devre dışı bırakmak için, sp_configure yordamının nested triggers seçeneğini 0 (kapalı) olarak ayarlayın. Varsayılan yapılandırma iç içe tetikleyicilere izin verir. nested triggers kapalıysa, recursive triggers da ayrıca, ALTER DATABASE kullanılarak yapılan RECURSIVE_TRIGGERS ayarına bakılmaksızın devre dışı bırakılır.

Bir INSTEAD OF tetikleyicisinin içindeki ilk AFTER tetikleyicisi, nested triggers sunucu yapılandırma seçeneği 0 olarak ayarlansa bile çalıştırılır. Ancak, bu ayar açık olduğunda, sonraki AFTER tetikleyicileri çalışmaz. Uygulamalarınızın nested triggers sunucu yapılandırması seçeneği 0 olarak ayarlıyken bu davranış açısından iş kurallarınızla uyumlu olup olmadığını belirlemek için uygulamalarınızı iç içe geçen tetikleyiciler için gözden geçirmenizi, sonra gerekli değişiklikleri yapmanızı öneririz.

Ertelenmiş Ad Çözümleme

SQL Server, Transact-SQL saklı yordamlarının, tetikleyicilerinin ve toplu işlerinin derleme zamanında var olmayan tablolara başvurmasına izin verir. Bu yeteneğe ertelenmiş ad çözümleme denir.

İzinler

Bir DML tetikleyicisi oluşturmak, tetikleyicinin oluşturulmakta olduğu tablo veya görünümde ALTER iznine sahip olmayı gerektirir.

Sunucu kapsamıyla (ON ALL SERVER) bir DDL tetikleyicisi veya bir oturum açma tetikleyicisi oluşturmak, sunucuda CONTROL SERVER izni gerektirir. Veritabanı kapsamıyla (ON DATABASE) bir DDL tetikleyicisi oluşturmak, geçerli veritabanında ALTER ANY DATABASE DDL TRIGGER izni gerektirir.

Örnekler

A.Bir anımsatma iletisiyle bir DML tetikleyicisi kullanma

Aşağıdaki DML tetikleyicisi, herhangi bir kimse Customer tablosuna veri eklemeye veya tabloda veri değiştirmeye çalıştığında istemciye bir ileti yazar.

USE AdventureWorks2012;
GO
IF OBJECT_ID ('Sales.reminder1', 'TR') IS NOT NULL
   DROP TRIGGER Sales.reminder1;
GO
CREATE TRIGGER reminder1
ON Sales.Customer
AFTER INSERT, UPDATE 
AS RAISERROR ('Notify Customer Relations', 16, 10);
GO

B.Bir anımsatıcı e-posta iletisiyle bir DML tetikleyicisi kullanma

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

USE AdventureWorks2012;
GO
IF OBJECT_ID ('Sales.reminder2','TR') IS NOT NULL
    DROP TRIGGER Sales.reminder2;
GO
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER INSERT, UPDATE, DELETE 
AS
   EXEC msdb.dbo.sp_send_dbmail
        @profile_name = 'AdventureWorks2012 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ını zorlamak için bir DML AFTER tetikleyicisi kullanma

CHECK kısıtlamaları yalnızca sütun düzeyi veya tablo düzeyi kısıtlamanın tanımlandığı sütunlara başvurabileceği için, tablolar arası tüm kısıtlamalar (bu durumda, iş kuralları) tetikleyici olarak tanımlanmalıdır.

Aşağıdaki örnek bir DML tetikleyicisi oluşturmaktadır. Bu tetikleyici, PurchaseOrderHeader tablosuna yeni bir satın alma siparişi eklenmeye çalışıldığında, iyi olduğundan emin olmak için satıcının kredi notunu denetlemektedir. Satıcının kredi notunu almak için Vendor tablosuna başvurulmalıdır. Kredi notu çok düşükse, bir ileti gösterilir ve ekleme işlemi çalışmaz.

USE AdventureWorks2012;
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 EXISTS (SELECT *
           FROM Purchasing.PurchaseOrderHeader p 
           JOIN inserted AS i 
           ON p.PurchaseOrderID = i.PurchaseOrderID 
           JOIN Purchasing.Vendor AS v 
           ON v.BusinessEntityID = p.VendorID
           WHERE v.CreditRating = 5
          )
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
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ı bir DDL tetikleyicisi kullanma

Aşağıdaki örnek, bir veritabanındaki herhangi bir eşanlamlının bırakılmasını önlemek için bir DDL tetikleyicisi kullanmaktadır.

USE AdventureWorks2012;
GO
IF EXISTS (SELECT * FROM sys.triggers
    WHERE parent_class = 0 AND name = 'safety')
DROP TRIGGER safety
ON DATABASE;
GO
CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_SYNONYM
AS 
   RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)
   ROLLBACK
GO
DROP TRIGGER safety
ON DATABASE;
GO

E.Sunucu kapsamlı bir DDL tetikleyicisi kullanma

Aşağıdaki örnek, geçerli sunucu örneğinde herhangi bir CREATE DATABASE olayı oluşursa bir ileti yazmak için bir DLL tetikleyicisi kullanmakta ve karşılık gelen Transact-SQL deyiminin metnini almak için EVENTDATA işlevini kullanmaktadır.

[!NOT]

DDL tetikleyicilerinde EVENTDATA kullanan başka örnekler için, bkz. eventdata işlevini kullanma.

IF EXISTS (SELECT * FROM sys.server_triggers
    WHERE name = 'ddl_trig_database')
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
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, login_test oturum açma grubunun bir üyesi olarak SQL Server'da bir oturum açma girişimini, bu oturum açma adıyla zaten açılmış durumda olan üç kullanıcı oturumu varsa engellemektedir.

USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' 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 çalışmasına neden olan olayları görüntüleme

Aşağıdaki örnek, hangi Transact-SQL dil olaylarının safety tetikleyicisini çalıştırdığını belirlemek için sys.triggers ve sys.trigger_events katalog görünümlerini sorgulamaktadır. safety önceki örnekte oluşturulmaktadır.

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

Ayrıca bkz.

Başvuru

ALTER TABLE (Transact-SQL)

alter TETIKLEYICI (Transact-sql)

columns_updated (Transact-sql)

Tablo (Transact-sql) oluştur

drop TETIKLEYICI (Transact-sql)

TETIKLEYICI (Transact-sql) etkinleştir

DISABLE TETIKLEYICI (Transact-sql)

TRIGGER_NESTLEVEL (Transact-sql)

eventdata (Transact-sql)

sys.dm_sql_referenced_entities (Transact-sql)

sys.dm_sql_referencing_entities (Transact-sql)

c.sys.sql_expression_dependencies (Transact-sql)

sp_help (Transact-sql)

sp_helptrigger (Transact-sql)

sp_helptext (Transact-sql)

sp_rename (Transact-sql)

sp_settriggerorder (Transact-sql)

update() (Transact-sql)

sys.triggers (Transact-sql)

sys.trigger_events (Transact-sql)

sys.sql_modules (Transact-sql)

sys.assembly_modules (Transact-sql)

sys.server_triggers (Transact-sql)

sys.server_trigger_events (Transact-sql)

sys.server_sql_modules (Transact-sql)

sys.server_assembly_modules (Transact-sql)

Kavramlar

dml Tetikleyiciler hakkında bilgi almak

dml Tetikleyiciler hakkında bilgi almak