2013-01-18 13 views
6

मैं एक ही टेबल पर उसी ईवेंट पर आग लगने वाले दो ट्रिगर्स के बीच समस्याओं को लॉक करने से कैसे रोक सकता हूं?एक ही तालिका के लिए दो अलग-अलग अपडेट ट्रिगर्स

डीबी मैं काम कर रहा हूं पहले से ही एक अपडेट ट्रिगर है जो एन्क्रिप्ट किया गया है और इसलिए मैं इसे संशोधित नहीं कर सकता। मैंने कुछ नए कार्यों को पूरा करने के लिए एक और अपडेट ट्रिगर बनाया है, जब मैं सीधे डेटाबेस पर इसका परीक्षण करता हूं तो यह ठीक से काम कर रहा है, लेकिन जब मैं फ्रंट एंड एप्लिकेशन पर किसी उत्पाद को अद्यतन करता हूं तो विफल रहता है। जाहिर है, जब मेरे ट्रिगर सक्रिय होते हैं तो दोनों ट्रिगर विफल हो जाते हैं। मुझे जो संदेश मिलता है वह कुछ है जैसे "दस्तावेज़ पहले से ही खुला है, मैं इसका मूल्य बढ़ा दूंगा"।

क्या यह एक लॉकिंग मुद्दा है?

एक related question है जहां कोई कहता है कि हमारे पास एक टेबल पर एक से अधिक ट्रिगर (एक ही ईवेंट के लिए) हो सकते हैं।

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TRIGGER [dbo].[tr_st_rep_update] 
ON [dbo].[st] 
AFTER UPDATE 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     IF (update(ref) 
      OR update(design) 
      OR update(u_update) 
      OR update(u_ativo) 
      OR update(stock) 
      OR update(epv1) 
      OR update(epv2) 
      OR update(epv3) 
      OR update(peso) 
      OR update(u_catnv1) 
      OR update(u_catnv2) 
      OR update(u_catnv3) 
      OR update(u_dpromoi) 
      OR update(u_dpromof) 
      OR update(u_destaque)) 
     BEGIN 
      IF (SELECT count(*) 
       FROM Inserted 
         INNER JOIN Deleted 
         ON Inserted.ststamp = Deleted.ststamp 
       WHERE inserted.u_ativo = 1 
         OR (Deleted.u_ativo = 1 
          AND Inserted.u_ativo = 0)) > 0 
       BEGIN 
        INSERT INTO RepData 
           (id, 
           REF, 
           familia, 
           stock, 
           epv1, 
           epv2, 
           epv3, 
           peso, 
           u_accao, 
           imagem, 
           process) 
        SELECT Inserted.ststamp AS id, 
         Inserted.REF  AS REF, 
         Inserted.familia AS familia, 
         Inserted.stock AS stock, 
         Inserted.epv1 AS epv1, 
         Inserted.epv2 AS epv2, 
         Inserted.epv3 AS epv3, 
         Inserted.peso AS peso, 
         CASE 
          WHEN Deleted.u_ativo = 1 
           AND Inserted.u_ativo = 0 THEN 'd' 
          ELSE 'u' 
         END    AS u_accao, 
         Inserted.imagem AS imagem, 
         0    AS process 
        FROM Inserted 
         INNER JOIN Deleted 
          ON Deleted.ststamp = Inserted.ststamp 
        WHERE inserted.u_ativo = 1 
          OR (Deleted.u_ativo = 1 
           AND Inserted.u_ativo = 0) 
       END 
     END 
    END 

किसी भी मदद की सराहना की जाएगी:

यहाँ मेरी चलाता कोड है।

अद्यतन: डेटाबेस MSSQL 2008

+1

क्या आप ** सटीक ** त्रुटि संदेश (या कम से कम त्रुटि संख्या अगर संदेश अंग्रेजी में नहीं है) दे सकते हैं। "दस्तावेज़ पहले से खुला है, मैं इसका मूल्य बढ़ा दूंगा" SQL सर्वर त्रुटि संदेश की तरह नहीं लगता है। –

+0

मुझे उस संदेश के अलावा कोई अन्य नहीं मिलता है, यह एक त्रुटि के रूप में भी नहीं दिखाया गया है बल्कि एक सूचना संदेश है।यदि यह प्रासंगिक है तो ऑपरेशन उत्पाद स्टॉक अपडेट है। – Fabio

+1

यदि इसका उत्पादन है, तो ऐप लॉग की जांच करें, इसे कहीं भी लिखा जाना है, अगर डीबी पर प्रोफाइलर नहीं चलाएं और देखें कि – WKordos

उत्तर

0

समस्या हल हो गई।

मुझे वास्तव में समस्या का स्रोत नहीं पता है, हालांकि मुझे लगता है कि यह टेबल लॉकिंग से संबंधित कुछ है, इस मामले में सम्मिलित तालिका पर।

मैंने अभी भी आंतरिक चयन कथन बदल दिया है ताकि मैं सीधे डालने के बजाय सेंट तालिका से मूल्यों को पकड़ सकूं।

सभी को धन्यवाद।

+1

आह, ठीक है। इसका मतलब है कि अन्य ट्रिगर [सेंट] टेबल पंक्तियों को संशोधित कर रहा था, जो [सेंट] में दिखाई देगा लेकिन [डालने] में नहीं। मेरा अनुमान यह होगा कि इसके बाद कुछ अन्य उल्लंघनों का कारण बन गया (संभवतः [रिपडाटा] में)। – RBarryYoung

8

साइट विकास और अनुकूलन में पोस्ट-परिनियोजन करने के लिए ट्रिगर्स का उपयोग करना एक आकर्षक है, लेकिन बुरा विचार है और इसमें कोई संदेह नहीं है कि लगातार आपके लिए ऐसी समस्याएं उत्पन्न होती हैं।

हालांकि, यह दिया गया, तो पहले: टेबल में एकाधिक ट्रिगर हो सकते हैं, यह समस्या नहीं है।

दूसरा, त्रुटि संदेश "दस्तावेज़ पहले से ही खुला है, मैं इसके मूल्य को बढ़ा दूंगा" या तो आपके क्लाइंट एप्लिकेशन से या अन्य (एन्क्रिप्टेड) ​​ट्रिगर से है, यह SQL सर्वर त्रुटि संदेश नहीं है। यह देखते हुए, संभवतः आप पहले निष्पादित करने के लिए एन्क्रिप्टेड ट्रिगर को सेट करने का प्रयास कर सकते हैं, या अंतिम बार निष्पादित करने के लिए अपना ट्रिगर सेट कर सकते हैं। यह शायद समस्या को ठीक नहीं करेगा, लेकिन एन्क्रिप्टेड ट्रिगर से त्रुटि को आपके ट्रिगर में ले जा सकता है जहां आपके पास रिपोर्ट करने और/या इसे प्रबंधित तरीके से संबोधित करने का बेहतर मौका है।

हालांकि, एकमात्र समस्या जो आपके ट्रिगर से संभवतः हो सकती है, यह है कि यदि अन्य ट्रिगर RepData तालिका पर भी लिख रहा है और आपका डबल लेखन डुप्लिकेट कुंजी उल्लंघनों का कारण बन रहा है।


उत्प्रेरक आदेश sp_settriggerorder प्रणाली प्रक्रिया है, जो here प्रलेखित है के माध्यम से नियंत्रित किया जा सकता।

+0

अच्छा जवाब, धन्यवाद! तो, मैं ट्रिगर्स के निष्पादन के आदेश को कैसे प्रबंधित कर सकता हूं? – Fabio

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