2012-04-03 13 views
19

मैं एक मूल डेटाबेस ट्रिगर बनाने की कोशिश कर रहा हूं जो डेटाबेस 2.table1 से पंक्तियों को सशर्त रूप से हटा देता है जब डेटाबेस 2.table2 से एक पंक्ति हटा दी जाती है। मैं ट्रिगर्स के लिए नया हूं और इसे पूरा करने का सबसे अच्छा तरीका सीखने की उम्मीद कर रहा था। अभी तक मेरे पास इतना ही है। सुझाव?SQL सर्वर ऑन डिलीट ट्रिगर

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

आप की जरूरत है इस बात को ध्यान में रखना कि ट्रिगर को ** ** प्रति स्टेटमेंट ** (और ** ** ** एक बार पे आर पंक्ति के रूप में कई देवताओं का मानना ​​है) और 'हटाए गए' छद्म तालिका में ** एकाधिक पंक्तियां हो सकती हैं ** (यदि आपका कथन एकाधिक पंक्तियों को हटा देता है) –

+0

@marc_s - सिस्टम में, केवल एक पंक्ति को संभवतः एक समय में हटाया जा सकता है (आवेदन फ्रंट एंड)। क्या आप इसका मतलब बता सकते हैं कि आपका क्या मतलब है। क्या यह 'WHERE id = delete.id' को' जहां आईडी में बदल दिया गया है (हटाए गए आईडी से चुनें) 'के रूप में सरल है? –

+2

@ShawnH। हाँ यह इतना आसान होना चाहिए। मुझे लगता है कि मार्क का मतलब है कि अगर किसी तरह से एक द्रव्यमान हटाया जाता है तो ट्रिगर केवल पंक्ति के बजाए पूरे कथन के लिए आग लग जाएगा, इसलिए 'आईएन' का उपयोग करके इसे किसी भी तरह से सॉर्ट करना चाहिए। – Bridge

उत्तर

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

धन्यवाद। यह बहुत आसान है और एक आकर्षण की तरह काम करता है। –

2

INSERTED और DELETED आभासी तालिकाओं कर रहे हैं। उन्हें FROM खंड में उपयोग करने की आवश्यकता है।

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

बेहतर उपयोग करने के लिए:

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

मैं exists बजाय in के उपयोग का सुझाव देते हैं, क्योंकि वह शून्य मान the behavior is different का तात्पर्य कुछ परिस्थितियों में, इसलिए

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