CREATE TRIGGER (Transact-SQL)
Bir DML, DDLveya oturum açma tetikleyici oluşturur.Tetikleyici veritabanı sunucusunda bir olay meydana geldiğinde otomatik olarak yürütür saklı yordam özel bir türüdür.Kullanıcı veri işleme dili (DML) olayüzerinden veri değiştirmeye çalıştığındaDML yürütmek tetikler.DML olayları INSERT, update ya da delete deyimlerini tablo ya da görünüm üzerinde.Herhangi bir geçerli olay etkinletirildiinde olup olmadığı hiçbir tablo satırları etkilenen ne olursa olsun bu tetiklemeleri ateşlemek.
DDL yürütmek veri tanımı dili (DDL) olayları çeşitli yanıt tetikler.Bu olaylar öncelikle karşılık Transact-SQL create, alter ve drop deyimi ve DDLyapmak bazı sistem saklı yordamları -benzeri işlemleri.Oturum açma Tetikleyicileri Ateş kullanıcı oturumları değiştiğinde harekete geçirilen olay oturum açma yanıt olarak kuruluyor.Tetikleyiciler, doğrudan oluşturulabilir Transact-SQL ifadeleri veya oluşturulan derleme yöntemleri Microsoft .NET Framework ortak dil çalışma zamanı (clr) ve örnek için karşıya SQL Server.SQL Serverherhangi belirli bir deyimiçin birden çok tetikleyici oluşturmak için izin verir.
Güvenlik Notu |
---|
Tetikleyici içinde kötü amaçlı kod escalated ayrıcalıklarıyla çalışır.Bu tehdide azaltmak konusunda daha fazla bilgi için bkz: Tetikleyici güvenliği yönetme. |
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 ] }
[ 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
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 ]
<method_specifier> ::=
assembly_name.class_name.method_name
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 ]
<method_specifier> ::=
assembly_name.class_name.method_name
Bağımsız değişkenler
schema_name
DML tetikleyici ait olduğu şema addır.DML Tetikleyicileri tablo ya da görünüm üzerinde oluşturuldukları şemasına belirlenmektedir.schema_nameDDL veya oturum açma tetikleyici belirtilemez.trigger_name
Tetikleyici adıdır.A trigger_name uymak gerekir kurallarını tanımlayıcıları, dışında trigger_name başlayamaz # ile veya ##.table | view
tablo veya Görünüm DML tetikleyici yürütülür ve bazen tetikleyici tablo veya tetikleyici görünüm olarak adlandırılır olabilir.tablo veya görünüm tam adını belirten isteğe bağlıdır.Görünüm, yalnızca bir INSTEAD of tetikleyicisi başvurulabilir.DML tetikleyiciler, yerel veya genel geçici tablolar tanımlanamaz.VERİTABANI
DDL tetikleyici kapsam geçerli veritabanına uygulanır.Belirtilmişse, tetiği her harekete event_type veya event_group oluşuyor geçerli veritabanı.TÜM SUNUCU
DDL veya oturum açma tetikleyici kapsam geçerli sunucuya uygulanır.Belirtilmişse, tetiği her harekete event_type veya event_group ortaya herhangi bir yerinde geçerli bir sunucu.ŞİFRELEME İLE
create TRIGGER deyimmetin obfuscates.WITH ENCRYPTION kullanarak engeller tetikleyicinin parçası olarak yayımlanan SQL Server çoğaltma.Şifreleme ile clr Tetikleyiciler için belirtilemez.EXECUTE AS
Tetikleyici yürütüldüğü güvenlik bağlamını belirtir.örnek kullanıcı hesabı denetimi sağlayan, SQL Server tarafından başvurulan veritabanı nesnelerinin izinlerini doğrulamak için kullanırtetikleyici.Daha fazla bilgi için, bkz. Yan (Transact-SQL) yürütme.
İÇİN | SONRA
SONRA yalnızca zaman tetikleyici SQLdeyim içinde belirtilen tüm işlemleri başarıyla çalıştırmış DML tetikleyici harekete olduğunu belirtir. Bu tetikleyici harekete önce tüm bilgi tutarlılığına basamaklı eylemleri ve sınırlama denetimleri de başarılı olmalıdır.SONRA varsayılandır olduğunda belirtilen yalnızca anahtar sözcüktür.
Tetikleyiciler sonra üzerinde görünümleri tanımlanamaz.
YERİNE
DML tetikleyici getirildiğini belirtir yerine SQLdeyim, bu nedenle tetikleyen, tetikleyici ifadeleri eylemlerini geçersiz kılma. Bunun yerine of DDL veya oturum açma tetikleyici belirtilemez.En çok, bir tetikleyici INSERT, update veya delete deyim her yerine bir tablo ya da görünüm üzerinde tanımlanabilir.Ancak, her görünüm tetikleyici yerine kendi sahip olduğu görünümlerinde görünüm tanımlayabilirsiniz.
INSTEAD of tetikleyicileri Denetle seçeneği ile birlikte kullanan güncellenebilir görünümleri üzerinde izin verilmez.SQL ServerGüncellenebilir bir görünüm ile belirtilen seçenek denetlemek için bir INSTEAD of tetikleyicisi eklenirken bir hata yükseltir.Kullanıcı bu seçeneği alter VIEW INSTEAD of tetikleyicisi tanımlamadan önce kaldırmalısınız.
{ [DELETE] , ] [EKLE] , [GÜNCELLEŞTİRME]}
Bu tablo ya da Görünüm karşı çalıştı, DML tetikleyici etkinleştirme veri değişikliği deyimleri belirtir.En az bir seçenek belirtilmeli.Bu seçeneklerden istediğiniz sırada herhangi bir bileşimini tetikleyici tanımını izin verilir.İçin INSTEAD OF tetikleyicileri, Sil seçeneği bir cascade eylem on delete belirterek bilgi tutarlılığına ilişkisi olan tablolara üzerinde izin verilmez.Benzer şekilde, güncelleştirme seçeneği on update gibi bir cascade eylem belirten bilgi tutarlılığına ilişkisi olan tablolara üzerinde izin verilmez.
event_type
Adı bir Transact-SQL Dil olay , yürütme, sonra sonra neden bir DDL tetikleyici yangın.DDL Tetikleyiciler için geçerli olaylar listelenen ddl olayları.event_group
Bir önceden tanımlanmış gruplandırma , adı Transact-SQL Dil olayları.DDL tetikleyici harekete herhangi bir yürütme sonrasında Transact-SQL Dil olay , ait olduğu event_group.DDL Tetikleyiciler için geçerli olay grupları listelenen ddl olay grupları.create TRIGGER çalışması, tamamlandıktan sonra event_group da makro olarak olay türleri ekleyerek, için Kapaklar davranır sys.trigger_events Katalog görünümü.
İLE EKLEME
Varolan bir tür ek bir tetikleyici eklenmesi gerektiğini belirtir.Tetikleyici açıkça belirtildiği sonra ile ekleme Tetikleyicileri veya eğer yerine kullanılamaz.append ile tek olduğunda kullanılır, INSTEAD of after, isterse geriye dönük uyumluluk açısından belirtilen olabilir.DIŞ ad belirtilmezse, append ile belirtilemez (yani, tetikleyici CLR tetikleyicisiise).Önemli append ile sonraki sürüm ' ün kaldırılacak Microsoft SQL Server.Değil yeni geliştirme çalışması ile append komutunu ve şu anda kullanan uygulamaları değiştirmek plan.
ÇOĞALTMA İÇİN DEĞİL
De tetikleyici söz konusu tablo çoğaltma Aracısı değişiklik yaptığında tetikleyici yürütülmelidir değil olduğunu gösterir.Daha fazla bilgi için, bkz. Denetleme sınırlamaları, kimlikleri ve tetikleyiciler not ile çoğaltma.sql_statement
Tetikleyici koşulları ve eylemleri olur.Tetikleyici koşullarının denenmiş DML, DDLveya oturum açma olayları gerçekleştirilecek Tetikleyici eylemleri neden olup olmadığını belirleyen ek ölçütler belirlemek.Tetikleyici eylemleri belirtilen Transact-SQL ifadeleri devreye işlemi çalıştığında.
Tetikleyiciler tüm sayısını ve türünü içerebilir, Transact-SQL ifadelerle, özel durumlar.Daha fazla bilgi için Açıklamalar'a bakın.Tetikleyici, denetlemek veya bir veri değişikliği veya tanım deyimdayalı verileri değiştirmek için tasarlanmıştır; Veri kullanıcıya vermemelidir.Transact-SQL Deyimlerinde tetikleyici sık dahil akış denetimli dil.
DML tetikler kullanımı deleted ve inserted mantıksal (kavramsal) tablolar.Üzerinde tetikleyici tanımlanmış, tablo , kullanıcı eylem çalışmış tablo yapısal olarak benzer.deleted Ve inserted eski değerleri veya kullanıcı eylemtarafından değiştirilen satırların yeni değerleri tabloları tutun.Örneğin, tüm değerleri almak için deleted tablokullanın:
SELECT * FROM deleted
Daha fazla bilgi için, bkz. Eklenen ve silinen tabloları kullanarak.
DDL ve oturum açma tetikleyicileri kullanarak olay hakkında bilgi yakalama eventdata (Transact-SQL) işlev.Daha fazla bilgi için, bkz. eventdata işlevini kullanma.
SQL Servergüncelleme için verir text, ntext, veya image sütunları ile INSTEAD of tetikleyici tablo veya görünüm.
Önemli ntext, text, ve image veri türleri kaldırıldı, gelecekteki bir sürüm de Microsoft SQL Server.Yeni geliştirme çalışması bu veri türlerini kullanmaktan kaçının ve bunları kullanan uygulamaları değiştirmek plan.Use nvarchar(max), varchar(max), ve varbinary(max) onun yerine.SONRA ve bunun yerine of tetikler Destek varchar(MAX), nvarchar(MAX), ve varbinary(MAX) verileri inserted ve deleted tablolar.
< method_specifier >
CLR tetikleyicisiiçin tetikleyici ile bağlamak için bir derleme yöntem belirtir.yöntem bağımsız değişkenleri ve void dönüş yok gerçekleştirmeniz gerekir.class_namebir geçerli olması SQL Server tanımlayıcısı ve derleme görünürlük derleme sınıf olarak varolması gerekirSınıf kullandığı bir ad alanıyla nitelenmiş ad olup olmadığını '.' ad alanının bölümlerini ayırmak için sınıf adı []'i kullanarak sınırlanması gerekir veya " " sınırlayıcı.İç içe geçmiş bir sınıf sınıf olamaz.Not
Varsayılan olarak, yeteneğini SQL Server clr çalıştırmak için kodudur kapatır.Oluşturmak, değiştirmek ve yönetilen kod modülleri başvuru veritabanı nesnelerini bırakın, ancak bu başvuruları değil yürütmek örnek de olur SQL Server sürece clr seçeneği etkin kullanarak etkin sp_configure.
Açıklamalar
DML Tetikleyicileri
DML tetikleyiciler, iş kuralları ve veri bütünlüğüsağlamada sık sık kullanılır.SQL Serverbildirim temelli bilgi tutarlılığı (DRI) alter table ve create table deyimleri sağlar.Ancak, DRI veritabanları arası bilgi bütünlüksağlamaz.Bilgi bütünlük kuralları tabloların birincil ve yabancı anahtarlar arasındaki ilişkileri hakkında ifade eder.Bilgi bütünlükzorlamak için alter table ve create table birincil anahtar ve yabancı anahtar kısıtlamaları'nı kullanın.Tetikleyici tablokısıtlamaları mevcut, sonra INSTEAD of tetikleyici yürütme ve sonra tetikleyici yürütme önce denetlenir.Kısıtlamaları ihlal, INSTEAD of Tetikleyici eylemleri geri alınır ve after tetikleyicisi yok tetiklenir.
İlk ve son tablo üzerinde yürütülecek tetikleyicileri kullanarak belirtilebilir sonra sp_settriggerorder.Tek bir ilk ve tek son tetikleyici sonra her INSERT, update ve delete işlemi bir tablobelirtilebilir.Aynı tablodiğer after tetikleyicilerini varsa, bunlar rasgele yürütülür.
Bir tetikleyici alter deyim ilk veya son tetikleyici değiştirir, ilk veya son öznitelik küme değiştirilmiş tetikleyici bırakılan ve sipariş değeri kullanarak sıfırlanması, sp_settriggerorder.
Yalnızca tetikleyici SQL deyim başarıyla yürüttü sonra after tetikleyicisi yürütülür.Bu başarılı yürütülmesine tüm bilgi tutarlılığına basamaklı eylemler ve güncelleştirildi veya silindi nesneyle ilişkili sınırlama denetimleri içerir.
tablo üzerinde tanımlı bir INSTEAD of tetikleyicisi her zaman yaptığınız tablo deyim yürütür INSTEAD of tetikleyici yeniden harekete, tetikleme yinelemeli olarak çağrılmaz.Bunun yerine, tablo yerine Tetik Hayır vardı ve kısıtlama işlemlerini ve tetikleyici yürütmeler sonra zinciri başlar deyim işlenir.Örneğin, bir tetikleyici INSTEAD OF INSERT bir tetikleyici tabloolarak tanımlanır ve tetikleyici aynı tabloINSERT deyim yürütür, INSTEAD of Tetikleyici tarafından yürütülen INSERT deyim tetikleyici yeniden çağırmaz.Tetikleyici tarafından yürütülen Ekle kısıtlama eylemleri gerçekleştirerek ve sonra ekleme Tetikleyicileri tabloiçin tanımlanmış hiçbir tetikleme işlemi başlar.
Görünüm üzerinde tanımlı bir INSTEAD of tetikleyici INSTEAD of tetikleyici yeniden normalde yangın görünümü karşı bir deyim çalıştırırsa, yinelemeli olarak çağrılmaz.Bunun yerine, deyim görünümün temelindeki temel tablolara yönelik değişiklikler olarak çözümlenir.Bu durumda, görünüm tanımını Güncellenebilir bir görünüm için tüm kısıtlamalar karşılamalıdır.Güncellenebilir görünümleri tanımına bakın Bir görünüm üzerinden veri değiştirme.
Örneğin, bir tetikleyici bir görünüm için bir update INSTEAD OF tetikleyicisi olarak tanımlanır ve aynı görünüme başvuran bir update deyim tetikleyici yürütür, INSTEAD of Tetikleyici tarafından yürütülen update deyim tetikleyici yeniden çağırmaz.Görünümü bir INSTEAD of tetikleyicisi olmadığı gibi tetikleyici tarafından yürütülen GÜNCELLEŞTİRMEYİ görünüm üzerinden işlenir.Bu GÜNCELLEŞTİRMEYLE değiştirilen sütunları tek bir temel tabloçözümlenmesi gerekir.Her değişiklik için temel bir temel tablo kısıtlamaları uygulamak ve sonra ' % s'tablo tabloiçin tanımlanmış tetikleyici tetikleme zinciri başlar.
Güncelleştirme veya ekleme eylemleri belirli sütunlara sınama
Siz tasarlayabilirsiniz bir Transact-SQL Tetikleyici belirli eylemleri gerçekleştirmek için temel güncelleştirme veya ekleme yaptığınız değişiklikleri belirli sütunları.Use update() veya columns_updated bu amaç için tetikleyici gövdesi içinde.update() sınamaları için bir sütungüncelleştirme veya ekleme çalışır.columns_updated hangi sütunların eklenen veya güncelleştirilen gösteren bit deseni verir ve birden fazla sütunda gerçekleştirilen update ve INSERT eylemler için sınar.
Tetikleyici kısıtlamaları
create TRIGGER toplu iş ilk deyim olmalıdır ve yalnızca bir tablouygulayabilirsiniz.
Tetikleyici, yalnızca geçerli veritabanında oluşturulur; Ancak, tetikleyici nesneleri geçerli veritabanının dışında başvuruda bulunabilir.
Tetikleyici nitelemek için tetikleyici şema adı belirtilmezse, tablo adı aynı şekilde nitelendirin.
Aynı tetikleyici eylem , birden çok kullanıcı eylem (örneğin, Ekle ve Güncelleştir) aynı create TRIGGER deyimiçin tanımlanabilir.
Bunun yerine, Sil/update tetikleyici tanımlanan Sil/güncelleştirme eylem yapılacak bir yabancı anahtar olan bir tablo tanımlanamaz.
Herhangi bir set deyim tetikleyici içinde belirtilebilir.set seçeneği seçili tetikleyici yürütme sırasında yürürlükte kalır ve onun önceki ayarına geri döner.
Bir tetiği harekete, sonuçlar döndürülür uygulamaya, olduğu gibi saklı yordamlar ile.Önlemek için bir Tetikleyici ateşlemesi nedeniyle uygulamaya döndürülen sonuçlar ekleme sonuçlar select deyimleri ya da değişken atama de tetikleyici gerçekleştirmek deyimleri.sonuçlar kullanıcıya select deyimleri ya da değişken atama gerçekleştirmek ifadeleri içeren tetikleyici özel işlem gerektirir; döndürülen sonuçlar değişiklikleri tetikleyici tablo için izin verilen her uygulamaya yazılması gerekir.Değişken atama de tetikleyici gerçekleşmelidir, set nocount deyim Tetik başında hiçbir sonuç kümeleri dönüşünü engellemek için kullanın.
truncate table deyim delete deyimetkin olmasına karşın, tek tek satır silme işlemi oturum değil çünkü bir tetikleyici etkinleştirmez.Ancak, yalnızca truncate table deyim yürütmek izni olan kullanıcılar atlama yanlışlıkla silme tetiği bu şekilde yapılabilir hakkında endişeniz olması gerekir.
WRITETEXT deyimoturum ya da unlogged, tetikleyici etkinleştirmez.
Aşağıdaki Transact-SQL deyimlerinin DML tetikleyici içinde izin verilmez:
ALTER VERİTABANI |
VERİTABANI OLUŞTURMA |
VERİTABANINI BIRAKMA |
YÜK VERİTABANI |
YÜKLEME GÜNLÜĞÜ |
YENİDEN YAPILANDIRIN |
VERİTABANINI GERİ YÜKLE |
GÜNLÜK GERİ YÜKLEME |
|
Ayrıca, aşağıdaki Transact-SQL deyimlerini tablo veya tetikleyici eylem hedef görünüm karşı kullanıldığında DML tetikleyici gövdesi içinde verilmez.
create INDEX (KAYMA dizin oluşturmak ve xml dizin oluşturma dahil) |
ALTER INDEX |
DROP INDEX |
DBCC DBREINDEX |
ALTER BÖLÜM İŞLEVİ |
TABLO BIRAKMA |
Aşağıdakileri yapmak için kullanıldığında tablo Değiştir:
|
|
|
Not
Çünkü SQL Server kullanıcı tanımlı tetikleyiciler desteklemiyor sistem tabloları, sistem tablolarıkullanıcı tanımlı tetikleyiciler oluşturmayın öneririz.
DDL Tetikleyicileri
DDL tetikler, standart tetikleyiciler gibi yürütmek saklı yordamlar bir olaymeydana.Ancak standart tetikleyiciler, bunlar değil yürütmek güncelleştir, Ekle veya delete deyimlerini tablo ya da görünüm üzerinde yanıt.Bunun yerine, bunlar öncelikle yürütmek veri tanımı dili (DDL) deyimleri için yanıt.Bunlar, oluştur, alter, drop, grant, deny, revoke ve update STATISTICS deyimi içerir.DDLyapmak bazı sistem saklı yordamları -gibi işlemleri de DDL Tetikleyiciler tetikleyebilir.
Önemli |
---|
Sizin DDL Tetikleyiciler sistem saklı yordam yürütme verdikleri yanıtlar belirlemek için sınayın.Örneğin, create type deyim ve sp_addtype ve sp_rename saklı yordamlar create_type olayüzerinde oluşturulan bir DDL tetikleyici ateşlenmesine. |
DDL tetikleyiciler hakkında daha fazla bilgi için bkz: ddl Tetikleyicileri.
DDL tetikleyiciler, yerel veya genel geçici tablolar ve saklı yordamlar etkileyen olaylarına yanıt olarak ateşlenmesine değil.
DML tetikleyiciler, DDL Tetikleyiciler şemaları için kapsamlı değil.Bu nedenle, DDL tetikleyiciler hakkında meta veriler sorgulamak için OBJECT_ID, nesne_adı, objectproperty ve objectpropertyex gibi işlevleri kullanılamaz.katalog görünümleri kullanın.Daha fazla bilgi için, bkz. ddl tetikleyiciler hakkında bilgi alma.
Not
Sunucu kapsamlı DDL Tetikleyicileri görünür SQL Server Management Studio Object Explorer'da Tetikleyicileri klasörü.Bu klasörün altında bulunan Sunucu nesneleri klasörü.Veritabanı kapsamlı DDL Tetikleyicileri görünür Veritabanı Tetikleyiciler klasörü.Bu klasörün altında bulunan programlama karşılık gelen veritabanı klasörü.
Oturum açma Tetikleyicileri
Oturum açma Tetikleyiciler yürütmek oturum açma olaymeydana saklı yordamları.Bu olay bir örnek ile kullanıcı oturum kurulduğunda oluşturulur SQL Server.Bitmez oturum kimlik doğrulaması aşamasını sonra oturum açma Tetikleyiciler ateşlenmesine, ancak önce kullanıcı oturum aslında oluşturulur.Yolu bu nedenle, genellikle hata iletileri ve yazdırma deyimiletileri gibi kullanıcı kaynaklandığından tetikleyici içinde kaynaklanan tüm iletiler için saptırabilir SQL Server hata günlüğü.Daha fazla bilgi için bkz: Oturum açma tetikleyici.
kimlik doğrulaması başarısız olursa, oturum açma tetikleyici başlatılmaz.
Dağıtılmış işlemler de oturum açma tetikleyici desteklenmez.dağıtılmış işlem içeren bir oturum açma tetikleyici etkinletirildiinde 3969 hata döndürülür.
Genel tetikleyici hakkında önemli noktalar
Sonuçları döndürülüyor
sonuçlar Tetikleyiciler dönme becerisi, gelecekteki bir sürüm SQL Server içinde kaldırılacaktır.Sonuç kümeleri Tetikleyiciler çalışabilmek için tasarlanmamış uygulamalarda beklenmeyen davranışlara neden olabilir.Yeni geliştirme çalışması Tetikleyicileri sonuç kümeleri döndüren önlemek ve şu anda bunu uygulamalarda değişiklik planlıyorsanız.Tetikleyicileri sonuç döndürmesini engellemek için ayarlar, küme sonuçlar Tetikleyiciler seçeneği izin verme 1.
Oturum açma tetikleyiciler, döndürülecek sonuçlar kümeleri her zaman izin vermez ve bu davranış yapılandırılabilir değildir.Oturum açma tetikleyici bir sonuç kümesioluşturmak, tetikleyici yürütmek başarısız olur ve tetikleyici harekete oturum açma denemesi ret edilir.
Birden çok tetikleyici
SQL Serverbirden çok tetikleyici her DML, DDLveya oturum açma olayoluşturulmasına olanak sağlar.Bir update tetikleyicisi olduğu için bir tablo oluşturmak için harekete GEÇİRİCİ Güncelleştir yürütülür, örneğin, ek bir güncelleştirme tetikleyici oluşturulur.Önceki sürümlerinde SQL Server, yalnızca bir her INSERT, update veya delete veri değişikliği olay her tabloiçin izin için tetiklemek.
Özyinelemeli tetikler
SQL Serveralter database kullanarak RECURSIVE_TRIGGERS ayarı etkinleştirildiğinde, tetikleyiciler, özyinelemeli çağırma için de izin verir.
Özyinelemeli tetikler ortaya özyineleme aşağıdaki türde etkinleştir:
Dolaylı özyineleme
Dolaylı özyineleme ile uygulama tablogüncelleştirirT1. Bu tetikleyici harekete TR1, tablogüncelleştirme T2.Bu senaryoda, tetikleyici T2 tablogüncelleştirir ve ardından harekete T1.
Doğrudan özyineleme
Doğrudan özyineleme ile uygulama tablogüncelleştirirT1. Bu tetikleyici harekete TR1, tablogüncelleştirme T1.Çünkü tablo T1 olan güncelleştirilmiş, tetikleyici TR1 tekrar harekete geçer ve böyle devam eder.
Aşağıdaki örnek, her iki dolaylı ve doğrudan tetikleyici özyineleme iki tetikleyiciler, güncelleştirme varsay kullanır TR1 ve TR2, tabloüzerinde tanımlı T1.Tetikleyici TR1 güncelleştirmeleri tablo T1 yinelemeli olarak.Her bir update deyim yürütür TR1 ve TR2 bir saat.Ayrıca, yürütülmesini TR1 yürütülmesini tetikleyen TR1 (yinelemeli olarak) ve TR2.inserted Ve deleted belirli bir tetikleyici için tabloları içeren satırlar karşılık, gelir yalnızca update deyim , çağrılan tetikleyici.
Not
RECURSIVE_TRIGGERS ayar alter database kullanarak yalnızca etkin olduğunda önceki davranış gerçekleşir.Belirli bir olay için tanımlanmış birden çok tetikleyici yürütüldüğü tanımlı hiçbir emri vardır.Her tetikleyici, kendi içinde olmalıdır.
RECURSIVE_TRIGGERS ayarın devre dışı bırakılması, yalnızca doğrudan recursions engeller.Ayrıca, dolaylı özyineleme devre dışı bırakmak için küme nested triggers server seçeneği kullanılarak 0 sp_configure.
Tetikleyiciler herhangi biri iç içe geçmiş düzeyne olursa olsun bir rollback İŞLEMİNİ gerçekleştirir, daha fazla bir tetikleyici yürütülür.
İç içe Tetikleyiciler
Tetikleyiciler maksimum 32 düzeye kadar iç içe olabilir.Bir tetikleyici değişirse olduğu başka bir tetikleyici, ikinci tetikleyici tablo etkinleştirilir ve sonra üçüncü bir tetikleyici çağrısı ve benzeri.Herhangi bir tetikleyici zincirindeki sonsuz bir döngüye ayarlar, iç içe geçmiş düzey aştı ve tetikleyici iptal edilir.Zaman bir Transact-SQL Tetikleyici bir clr yordam, türünü veya toplubaşvurarak yönetilen kod yürütür, bu başvuru 32 - karşı bir düzey sayılacaktır sınırı. iç içe geçmişdüzeyyönetilen kod içinde açılmak istenen yöntemleri bu sınırınızı etkiler.
İç içe tetikleyiciler, küme devre dışı bırakmak için nested triggers seçeneği sp_configure için 0 (kapalı).İç içe Tetikleyiciler için varsayılan yapılandırma sağlar.nested triggers Kapalıysa, recursive triggers de dışıdır, ne olursa olsun RECURSIVE_TRIGGERS ayar küme kullanarak alter veritabanı.
Not
De SQL Server 2000, her tetikleyici ne zaman başlatılmıyor içinde bir INSTEAD of tetikleyicisi iç içe sonra nested triggers sunucu yapılandırma seçeneği kapalı olduğundanDe SQL Server 2005 veya sonraki sürümlerde, tetikleyici tetikleyici geçirilir bile, bir INSTEAD içinde iç içe sonra ilk nested triggers sunucu yapılandırma seçeneğidir küme için 0.Ancak, bu ayarı altında daha sonra Tetikleyiciler başlatılmaz.Uygulamalarınız için uygulamalar hala iş kuralları Bu davranış için uyumlu olup olmadığını belirlemek iç içe Tetikleyiciler incelemenizi öneririz, nested triggers sunucu yapılandırma seçeneği ise 0, küme ve yapın uygun değişiklikler.
Ertelenmiş ad çözümlemesi
SQL Serververir Transact-SQL saklı yordamlar, Tetikleyiciler ve derleme süresivarolmayan tablolara başvurmak için toplu.Bu yeteneği, ertelenmiş ad çözümlemesi denir.Ancak, Transact-SQLsaklı yordam, tetikleyici veya toplu iş başvuruda saklı yordam veya tetikleyici tanımlanan tablo , yalnızca Uyumluluk düzey ayarı 65 ise, uyarısı oluşturma saat verilir. toplu iş kullanılıyorsa, derleme süresi bir uyarı verilir.Başvurulan tablo yoksa çalışma saat sırasında bir hata iletisi döndürülür.Daha fazla bilgi için, bkz. Ertelenmiş ad çözümlemesi ve derleme.
İzinler
DML oluşturmak için tablo veya Görünüm tetikleyici oluşturulmaktadır alter izninin tetikleyici gerektirir.
Sunucu kapsam (on tüm sunucu) veya oturum açma ile DDL tetikleyici oluşturmak için tetikleyici server control server izni gerektirir.DDL oluşturmak için alter any database DDL tetikleyici izni geçerli veritabanında veritabanı kapsam (on database) tetikleyici gerektirir.
Örnekler
A.Bir anımsatıcı iletisi DML tetikleyici kullanma
Herkes eklemek veya veri değiştirmek çalıştığında aşağıdaki DML tetikleyici istemci bir ileti yazdırır Customer tablo.
USE AdventureWorks2008R2;
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 iletisi DML tetikleyici kullanma
Aşağıdaki örnek, belirtilen bir kişi e-posta iletisine gönderir (MaryM), Customer tablo değişiklikleri.
USE AdventureWorks2008R2;
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 = 'AdventureWorks2008R2 Administrator',
@recipients = 'danw@Adventure-Works.com',
@body = 'Don''t forget to print a report for the sales force.',
@subject = 'Reminder';
GO
C.İş kuralı PurchaseOrderHeader ve satıcı tabloları arasındaki zorlamak için after DML tetikleyici kullanma
Denetim kısıtlamalarını yalnızca sütun-düzey veya tablo-düzey kısıtlaması tanımlanan sütunları aldığından, tüm çapraz -tablo kısıtlamalarını (Bu durum iş kuralları) Tetikleyiciler tanımlanmalıdır.
Aşağıdaki örnek, DML tetikleyici oluşturur.Yeni bir satınalma siparişi eklemek girişimi yapıldığında, satıcı iyi için kredi notu emin olmak için bu tetikleyici denetler PurchaseOrderHeader tablo.Satıcının kredi notu elde etmek için Vendor tablo başvurulan.Kredi notu çok düşükse, bir ileti görüntülenir ve yürütmekekleme yapar.
Not
Birden çok satır güncelleştirme DML sonra Tetikleyiciler örnekleri için bkz: dml Tetikleyiciler için MultiRow düşünceleri.INSTEAD OF INSERT Tetikleyicilerini DML örnekleri için bkz: INSTEAD OF INSERT Tetikleyicilerini.
USE AdventureWorks2008R2;
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
DECLARE @creditrating tinyint, @vendorid int;
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 ('This 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ı DDL tetikleyici kullanma
Aşağıdaki örnek bir DDL tetikleyici bırakılan gelen herhangi bir veritabanında veri türünün eşanlamlısı önlemek için kullanır.
USE AdventureWorks2008R2;
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ı DDL tetikleyici kullanma
Aşağıdaki örnek, bir veritabanı oluşturma olay geçerli sunucu örnekoluşur ve kullanırsa, iletiyi yazdırmak için DDL tetikleyici kullanır EVENTDATAbuna karşılık gelen metin almaişlev Transact-SQLdeyim.
Not
İçinde DDL Tetikleyicileri eventdata kullanmak daha fazla örnek 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 tetikleyici kullanma
Oturum denemesi aşağıdaki oturum açma tetikleyici örnek vermez SQL Server bir üye olarak login_test login varsa zaten üç kullanıcı oturumları çalışan altında oturum açma.
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.Bir tetikleyici ateşlenmesine neden olayları görüntüleme
Aşağıdaki örnek sorgu sys.triggers ve sys.trigger_events katalog görünümleri belirleme Transact-SQL Dil olaylara neden tetikleyici safety yangın.safetyÖnceki örnekte oluşturulmuş.
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.