2012-03-24 18 views
7

मैं एसक्यूएल सर्वर 2000 पर बनाए गए विरासत अनुप्रयोग में कुछ बदलाव कर रहा हूं, कहने की जरूरत नहीं है कि मैं केवल डर में पूर्ण न्यूनतम करना चाहता हूं कि यह सब कुछ अलग हो सकता है।अद्यतन ट्रिगर की स्थापना - क्या यह संभव है?

मेरे पास उपयोगकर्ताओं की एक बड़ी तालिका है, tbUsers, IsDeleted के लिए बीआईटी ध्वज के साथ। मैं अपने संग्रह तालिका tbDeletedUsers में सभी मौजूदा और भविष्य IsDeleted = 1 उपयोगकर्ता रिकॉर्ड को संग्रहीत करना चाहता हूं।

वर्तमान में हटाए गए उपयोगकर्ताओं को स्थानांतरित करना सीधे आगे है, हालांकि मैं किसी भी भविष्य के उपयोगकर्ताओं को स्थानांतरित करने का एक तरीका चाहता हूं जहां IsDeleted ध्वज सेट किया गया हो। मैं कॉलम पर ट्रिगर करने के बाद मानक का उपयोग कर सकता हूं, हालांकि मैं टीबीयूसर टेबल पर कुछ बाधाओं को जोड़ने की योजना बना रहा हूं जो इसका उल्लंघन करेगा, जो मैं चाहता हूं कि अद्यतन के मेरे इंस्टॉलेशन के लिए आग लगने के लिए और रिकॉर्ड तालिका में रिकॉर्ड को स्थानांतरित करने के लिए क्या है?

मुझे लगता है कि मेरा प्रश्न है ... क्या एक व्यक्तिगत कॉलम के अपडेट पर अद्यतन ट्रिगर के इंस्टाल को ट्रिगर करना संभव है? यह मेरे पास अब तक है:

CREATE TRIGGER trg_ArchiveUsers 
INSTEAD OF UPDATE ON tbUsers 
AS 
    BEGIN 
     ... 
    END 
GO 

यदि ऐसा कोई उदाहरण (SQL 2000 संगत) की बहुत सराहना की जाएगी!

उत्तर

12

UPDATE(columnname) परीक्षण का उपयोग करके आप एक ट्रिगर है कि क्या एक विशिष्ट स्तंभ अद्यतन किया गया था (और फिर विशिष्ट कार्यवाही) में जांच कर सकते हैं, लेकिन आप एक ट्रिगर केवल एक विशिष्ट स्तंभ के अद्यतन पर आग नहीं हो सकता । जैसे ही अपडेट किया गया है, इस पर ध्यान दिए बिना, यह अपडेट किए जाने पर यह आग लग जाएगी। जब IsDeleted अद्यतन किया जाता है (या - tbDeletedUsers में डालने + tbUsers से हटा दें

1):

तो, अगर आपको लगता है कि आप एक INSTEAD OF UPDATE ट्रिगर का उपयोग करने के लिए है, तो आप इसे में कार्रवाई के दो प्रकार लागू करने के लिए की आवश्यकता होगी , अधिक सटीक, अद्यतन और1 पर सेट किया गया);

2) सामान्य रूप से tbUsers अद्यतन - जब IsDeleted अद्यतन किया जाता है नहीं (या अद्यतन लेकिन 1 के लिए सेट नहीं)।

क्योंकि एक से अधिक पंक्तियां एक भी UPDATE अनुदेश के साथ अद्यतन किया जा सकता है, तो आप भी ध्यान में रखना कुछ पंक्तियों 1 और दूसरों को नहीं करने के लिए IsDeleted सेट हो सकता है की आवश्यकता हो सकती।

मैं INSTEAD OF चलाता का एक बड़ा प्रशंसक नहीं हूँ, लेकिन अगर मैं वास्तव में आपकी कंपनी जैसी किसी कार्य के लिए एक का उपयोग करने के लिए किया था, मैं UPDATE() परीक्षण को छोड़ देते हैं और इस तरह से ट्रिगर लागू हो सकता है:

CREATE TRIGGER trg_ArchiveUsers 
ON tbUsers 
INSTEAD OF UPDATE 
AS 
BEGIN 
    UPDATE tbUsers 
    SET 
    column = INSERTED.column, 
    … 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 0 
    ; 
    DELETE FROM tbUsers 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 1 
    ; 
    INSERT INTO tbDeletedUsers (columns) 
    SELECT columns 
    FROM INSERTED 
    WHERE IsDeleted = 1 
    ; 
END 
+1

अपडेट (कॉलमनाम) SQL सर्वर में मौजूद नहीं है। इसके बजाय, COLUMNS_UPDATED (कॉलमनाम) का उपयोग करें। http://msdn.microsoft.com/en-us/library/ms186329.aspx –

+1

टिप्पणी के लिए धन्यवाद। आप सही हैं, SQL सर्वर में कोई UPDATES() फ़ंक्शन नहीं है, न ही UPDATED(), जैसा कि मैंने प्रारंभ में लिखा था। इसे वास्तव में [अद्यतन()] कहा जाता है (http://msdn.microsoft.com/en-us/library/ms187326.aspx)। मेरे जवाब को संपादित करना और मेरी गलती को मेरे ध्यान में लाने के लिए धन्यवाद। –

+0

और आपको भी गलत समझा जाता है, क्योंकि COLUMNS_UPDATED() पैरामीटर स्वीकार नहीं करता है। यह ट्रिगर को बुलाए गए बयान से प्रभावित सभी कॉलम को प्रतिबिंबित करने वाला थोड़ा मुखौटा देता है। मैंने कभी भी उस फ़ंक्शन का उपयोग नहीं किया है, हालांकि, मैन्युअल से, मुझे लगता है कि मुझे इसका कोई अंदाज़ा नहीं है कि इसका उपयोग कैसे किया जाए। –