2012-12-24 27 views
6

से हटाए जाने से पहले तालिका में हटाए गए मानों को किसी कारण से मुझे सटीक उत्तर नहीं मिल रहा है। मैंने यहां पिछले 20 मिनट की खोज की।INSERT हटाए गए मानों को एक हटाए गए ट्रिगर

मुझे पता है कि यह आसान है। बहुत आसान। लेकिन मैं किसी कारण से ट्रिगर आग नहीं कर सकते ..

मैं एक मेज है दो कॉलम

dbo.HashTags

|__Id_|_name_| 
| 1 | Love | 

मैं एक तालिका में नष्ट कर दिया मूल्यों सम्मिलित करना चाहते हैं के साथ को DELETE क्वेरी पर बुलाया गया।

उदाहरण:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete] 
    ON [dbo].[HashTags] 
    FOR DELETE 
AS 
    BEGIN 
    INSERT INTO HashTagsArchive 
    (Id, 
    HashTagId, 
    delete_date) 
    SELECT d.Id, m.HashTagId,GETUTCDATE() FROM deleted d 
    JOIN dbo.HashTags m ON m.Id=d.Id 
    DELETE FROM dbo.HashTags 
    WHERE ID IN(SELECT deleted.Id FROM deleted) 
    END 
GO 

:

DELETE FROM [dbo].[HashTags] WHERE Id=1 

इस उदाहरण के बाद मुझे dbo.HashTagsArchive में हटाई गई पंक्ति और Id=1 साथ पंक्ति होना चाहिए dbo.HashTags

में हटा दिया जाना चाहिए मैं इस ट्रिगर करने की कोशिश की यह Deleted हो रहा है लेकिनमें कोई Inserted पंक्ति नहीं है 0

उत्तर

12

आपका समस्या है: इस ट्रिगर आग बाद हटाने पहले से ही हुआ है। तो HashTags में कोई और पंक्ति नहीं है जिसमें आप शामिल हो सकते हैं!

इसके बजाय आप इस ट्रिगर का उपयोग करने की जरूरत है:

ALTER TRIGGER [dbo].[HashTags_BeforeDelete] 
    ON [dbo].[HashTags] 
    FOR DELETE 
AS 
    BEGIN 
    INSERT INTO HashTagsArchive(Id, HashTagId, delete_date) 
     SELECT 
      d.Id, d.HashTagId, GETUTCDATE() 
     FROM deleted d 
    END 
GO 

Deleted छद्म तालिका पूरी पंक्ति (रों) कि नष्ट कर दिया गया होता है - कुछ भी पर शामिल होने के लिए कोई जरूरत नहीं ...

इसके अलावा : यह ट्रिगर हटाने के बाद आग लगती है - इसलिए आपको ट्रिगर के अंदर कुछ भी करने की ज़रूरत नहीं है - बस जानकारी के उन बिट्स को अपनी संग्रह तालिका में डालें - यह सब कुछ है। बाकी सब कुछ आपके लिए SQL सर्वर द्वारा संभाला जाता है।

+0

धन्यवाद! सही काम करता है! – Ofear