2010-07-29 16 views
10

SQL Server 2008 R2'nin önceden tanımlanmış "CREATE TRIGGER" öğesini kullanarak tetikleyici oluşturmak istediğimde kayboldum. Lütfen bana bir tetikleyici oluşturmak için kullanabileceğim doğrudan bir SQL ifadesi verebilir ve bana AFTER, ÖNCE ve bunların tümünü nasıl tanımlayacağımı söyler misiniz?SQL Server'da Tetik Oluşturma

Ayrıca, UPDATED/INSERTED/DELETED satırlarını bilebilir ve tetikleyicinin içinde işlem yapmak için sütun değerlerini kullanabilir miyim?

+0

@John geçerli: ürünü "SQL Server" değil "MSSQL" denir. "MSSQL" kolayca "MySQL" ile karıştırılabilir. Ayrıca, bir SQL Server sorusu sorduğunuzda, "sql-server" etiketini kullanmanızı öneririm. "sql", SQL dili hakkında genel sorular içindir. –

+0

Not için teşekkürler. Bunu yapacak. – johnshaddad

+0

Sorunuz basit olarak bir tetikleyicinin nasıl tanımlanacağıyla ilgili mi, yoksa etkilenen satırlarda işlem yapmak için kullanabileceğiniz bir tetikleyici nasıl yazılır? Daha sonra, o zaman sorunuzu yeniden düşünmeyi düşünmelisiniz. – Thomas

cevap

2

Veritabanları ayarlanmış ve tetikleyiciler farklı değildir. Belirli bir işlem yapıldığında tetikleyici tetiklenir ve bu işlem birden çok satırı etkileyebilir. Böylece, "Say I want to know the Primary Key of that row" sorusu bir yanlış isimdir. Birden çok satır eklenmiş olabilir.

SQL Server, inserted ve deleted adlı AFTER tetikleyicileri için iki özel tablo sunar ve bunlar bir eylem tarafından eklenmiş veya silinmiş satırları temsil eder ve etkilenen tabloyla aynı şekilde yapılandırılır. Bir güncelleme tetikleyicisi hem inserted hem de deleted'u doldurabilirken, bir ek tetikleyici yalnızca inserted tablosunu doldurabilir. sözlerinden

: e-posta alıcısı karar yabancı anahtar kimliği tetik ile biri olan (ilk tablodaki bulunan ikinci bir tabloda, bir değere dayalı olacaktır

ama

Bu sorunun cevabı, satırlar arasında gezinmek ve bir e-posta göndermek için inserted tablosunu (yine birden çok satıra sahip olabileceğini varsayalım) kullanmaktır. Ancak, bir e-posta mantığını tetikleyiciye koymanızı öneriyorum. Bu mantığı saklı bir prosedüre koymanızı ve e-postanızı şapka. Başvuru için

: Create Trigger

+0

Ve sonra bu yordamı tetikleyiciden çağırmak için? Demek istediğin bu mu?Ancak, tetikleyicide bunu işlemek için yeterli sql posta sistemi prosedürü değil mi? veya bu sistem prosedürünü çağıran bir prosedür oluşturmalı ve ardından bu prosedürü tetikleyicide çağırmalı mıyım? – johnshaddad

+0

@johnshaddad - Hayır. Bir tetikleyiciden e-posta işlemleri yapmam. Bunun yerine, çağrı kodunuzu doğrudan tabloya karşı çalışmak yerine saklanan progı kullanacaktır. – Thomas

+0

"Birden çok satır eklenmiş olabilir" dediğinizde. Bu tetikleyiciyi defalarca ateşlemiyor mu? Veya nasıl? Böyle bir durumda nasıl döneceğimi açıklar mısınız? – johnshaddad

2

Tetikleyici, bir tablonun bir şekilde değiştirilmesinin ardından "tetiklenen" olay tabanlı bir işlemdir. Bu DELETE, UPDATE, INSERT vb. ÖNCE ve SONRAKİ sözdizimi, olayın gerçekleşmesinden önce veya sonra tetikleyiciyi çalıştırıp çalıştırmayacağını belirler.

Bu kısa sürüm. MSDN'a bakın.

+0

Evet, MySQL üzerinde tetikleyicilere aşinayım, ancak MSSQL'de değilim, bu yüzden farklı bir uygulama yolu olduğunu düşündüm. Teşekkürler! – johnshaddad

+0

Ancak hangi satırın güncelleneceğini nasıl bilebilirim? O sıranın Birincil Anahtarını bilmek istediğimi söyle, nasıl yapmalı? Yeni bir öğe eklendikten sonra bir e-posta göndermek gibi bir şey, ancak e-posta alıcısı, yabancı anahtar kimliğinin ilk tabloda (tetikleyici olan) bulunduğu ikinci bir tablodaki bir değere göre kararlaştırılır. – johnshaddad

+0

mrdenny's Joel Coehoorn'un cevabına yapılan cevap, iyi bir özet. –

10

temel sözdizimi

CREATE TRIGGER YourTriggerName ON dbo.YourTable 
FOR|AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    /*Put what ever you want here*/ 
    UPDATE AnotherTable 
      SET SomeColumn = AnotherColumn 
    FROM inserted | deleted 
END 
GO 
+0

Bunu deniyorum ve MS sunucusunda benim için çalışmıyor. –