2012-04-03 19 views
19

Veritabanı2.table2'den bir satır silindiğinde satırları veritabanı1.table1'den koşullu olarak silen temel bir veritabanı tetikleyicisi oluşturmaya çalışıyorum. Tetikleyicilere yeniyim ve bunu başarmanın en iyi yolunu öğrenmeyi umuyordum. Şimdiye kadar sahip olduğum şey bu. Öneriler?SQL Server ON DELETE Tetikleyici

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id = deleted.id 
       AND bar = 4) 

-- If there is a row that exists in database2.dbo.table2 
-- matching the id of the deleted row and bar=4, delete 
-- it as well. 

-- DELETE STATEMENT? 

GO 
+4

İhtiyacınız Tetikleyicinin ateşlendiğini hesaba katmak ** ifadesiyle bir kez ** (ve ** NOT ** bir kez pe Birçok devir inanıyorum gibi r satır) ve "Silindi" sahte tablo ** birden fazla satır içerebilir ** (ifadeniz birden çok satırı sildiyse) –

+0

@marc_s - Sistemde bir seferde yalnızca bir satır silinebilir (uygulama ön ucu). Ne demek istediğini anlatabilir misin? 'WHERE id = deleted.id' 'i WHERE id IN (SELECT ID silindi)' ne çevirmek kadar basit mi? –

+2

@ShawnH. Evet bu kadar basit olmalı. Bence Marc bir şekilde silâhın bir yerden silindiğini söylerse, tetikleyici sadece satır başına değil, tüm deyim için bir kez ateş edecekti, bu yüzden bir “IN” kullanmak her iki şekilde de sıralamalıdır. – Bridge

cevap

49
CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 
    WHERE bar = 4 AND ID IN(SELECT deleted.id FROM deleted) 
GO 
+0

Teşekkür ederim. Bu çok daha basit ve çekicilik gibi çalışıyor. –

2

INSERTED ve DELETED sanal tablolardır. FROM maddesinde kullanılmaları gerekir. Daha iyi

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    IF EXISTS (SELECT foo 
       FROM database2.dbo.table2 
       WHERE id IN (SELECT deleted.id FROM deleted) 
       AND bar = 4) 
8

kullanmak:

DELETE tbl FROM tbl INNER JOIN deleted ON tbl.key=deleted.key 
1

Ben exists yerine in kullanımını öneririm çünkü boş değerler the behavior is different ima bazı senaryolarda, bu nedenle

CREATE TRIGGER sampleTrigger 
    ON database1.dbo.table1 
    FOR DELETE 
AS 
    DELETE FROM database2.dbo.table2 childTable 
    WHERE bar = 4 AND exists (SELECT id FROM deleted where deleted.id = childTable.id) 
GO