2013-05-18 9 views
8

ठीक से एकाधिक पंक्ति अद्यतन एसक्यूएल ट्रिगर। मैं एसक्यूएल ट्रिगर्स के लिए काफी नया हूं और उनके साथ कुछ समस्याएं हैं। ट्रिगर डालें बस ठीक काम करता है, और हटाएं ट्रिगर भी। सबसे पहले, कई पंक्तियों पर एक डिलीट करने से केवल एक ही हट जाएगा, लेकिन मैं इसे अपने लिए बाहर निकालने में कामयाब रहा :)एकल पंक्ति एसक्यूएल स्टेटमेंट

हालांकि, व्यापक खोज (यहां और Google पर) के बाद भी मैं एक संतोषजनक उत्तर नहीं ढूंढ पा रहा हूं मेरे पास अद्यतन ट्रिगर के लिए है। यदि मैं

UPDATE Customers Set CustomerUser = 0 Where CustomerStatus = 3 

पर दुर्भाग्यवश, केवल एक रिकॉर्ड अपडेट किया जाएगा, और दूसरा वैसे ही रहेगा जैसे अद्यतन। जाहिर है, यह कोई अच्छा नहीं है।

ट्रिगर मैं उपयोग कर रहा हूँ है:

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers] 

FOR UPDATE 

AS 
declare @customerid int; 
declare @customervenue int; 
declare @customeruser int; 
declare @customerarea int; 
declare @customerevent int; 
declare @customerproject int; 
declare @customerstatus int; 

select @customerid=i.CustomerID from inserted i; 
select @customervenue=i.CustomerVenue from inserted i; 
select @customerarea=i.CustomerArea from inserted i; 
select @customerevent=i.CustomerEvent from inserted i; 
select @customerproject=i.CustomerProject from inserted i; 
select @customeruser=i.CustomerUser from inserted i; 
select @customerstatus=i.CustomerStatus from inserted i; 

Update USER_Instances Set InstanceArea = @customerarea, InstanceVenue = @customervenue, InstanceUser = @customeruser, InstanceStatus = @customerstatus, InstanceEvent = @customerevent, InstanceLastUpdate = GetDate() Where InstanceObject = 17 AND InstanceIdentity = @customerid 
GO 

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

स्टैक ओवरफ़्लो पर मैंने जो उदाहरण देखे हैं, वे मुझे कुछ हद तक भ्रमित करते हैं, या अप्रभावी लगते हैं - उदाहरण के लिए, ऐसा लगता है कि उनमें से अधिकतर एक दूसरे/अन्य तालिका में केवल एक मान को अपडेट करने के साथ सौदा करते हैं, और पूरे समूह की तरह नहीं करने का प्रयत्न। वे जो कई मानों पर काम करने लगते हैं, मैं समझ नहीं पा रहा हूं :(

तो लगभग 2 घंटे की खोज के बाद, मैं हार मानता हूं, और उम्मीद करता हूं कि आप मेरी मदद कर सकते हैं :) मुझे एहसास है कि यह एक ट्रिगर-नौसिखिया मुद्दा है , और हालांकि मैं अपने एमएस-एसक्यूएल को जानता हूं, ट्रिगर कुछ ऐसा है जो मैंने कभी नहीं किया है। तो किसी भी मदद की बहुत :) का स्वागत करते हैं

डब्ल्यू
+0

'डाली गई' तालिका में कई पंक्तियां हो सकती हैं। मैं ट्रिगर्स का उपयोग करने के खिलाफ हर किसी को सलाह देता हूं। वे सही होने के लिए बहुत कठिन हैं, और यदि आप प्रबंधित करते हैं, तो परिणाम बनाए रखना बहुत मुश्किल है। – Andomar

+0

खैर ... मैं सिद्धांत रूप से पोस्ट-अपडेट एसक्यूएल स्टेटमेंट के साथ अद्यतन कर सकता हूं, और जब तक INSERT और DELETE काम ठीक है, यह संभवतः दूसरा सबसे अच्छा समाधान होगा। लेकिन मैं अभी भी जानना चाहता हूं कि इस ट्रिगर को सही तरीके से कैसे बनाया जाए ... मैं केवल ट्रिगर्स के एक सेट का उपयोग कर रहा हूं क्योंकि परिस्थिति में यह वही है जो मुझे चाहिए, और सबसे अच्छा समाधान प्रदान करता है :) आपकी टिप्पणी के लिए धन्यवाद। – Irresistance

+0

@Iresresistance Triggers कई कारणों से एक गैर-पसंदीदा समाधान हैं। जैसा कि एंड्रोमर कहते हैं, उन्हें लिखना और बनाए रखना मुश्किल है। वे आईएनएसईआरटी, अपडेट और डिलीट के प्रदर्शन को भी प्रतिकूल रूप से प्रभावित करते हैं, लेन-देन को और अधिक जटिल बनाते हैं, डेडलॉक्स का मौका बढ़ा सकते हैं, और परिचालन कार्यों के लिए वास्तविक दर्द हैं। लेकिन सबसे बड़ा कारण यह है कि वे सामान्य दृश्य से छिपे हुए हैं, जिससे उन्हें प्रभावी रूप से "जादू" बना दिया जाता है। ट्रिगर्स लगातार डीबीए और डेवलपर्स को समान रूप से यात्रा करते हैं क्योंकि वे उनके बारे में भूल जाते हैं, जिसके परिणामस्वरूप कई लंबे समय तक चलने वाले समर्थन मुद्दों का सामना करना पड़ता है, "क्या उस तालिका में कोई ट्रिगर है?" – RBarryYoung

उत्तर

13

ऐसा लगता है कि आप इस

ALTER TRIGGER [dbo].[TRG_TriggerName] ON [dbo].[USER_Customers] 
FOR UPDATE 
AS 
UPDATE USER_Instances 
    SET InstanceArea = i.CustomerArea, 
     InstanceVenue = i.CustomerVenue, 
     InstanceUser = i.CustomerUser, 
     InstanceStatus = i.CustomerStatus, 
     InstanceEvent = i.CustomerEvent, 
     InstanceLastUpdate = GetDate() 
    FROM USER_Instances JOIN inserted i 
    ON InstanceIdentity = i.CustomerID AND InstanceObject = 17 

की तरह कुछ की जरूरत है के बाद से inserted आभासी तालिका एकाधिक पंक्तियों को शामिल कर सकते हैं इसे सही ढंग से अपने UPDATE क्या करना JOIN करने की जरूरत है।

+0

आप दा आदमी !! यह वही है जो मुझे चाहिए, और मैं इस स्पष्ट और सुरुचिपूर्ण समाधान के साथ आने के लिए खुद को बेरेट नहीं करता !! – Irresistance

+0

@ पेटर्म, मेरे पास एक ही समस्या है कृपया निम्नलिखित लिंक जांचें http://stackoverflow.com/questions/26043106/how-to-determine-if-insert-or-update/26143185#26143185 – Prathyush

संबंधित मुद्दे