2008-10-29 21 views
9

में हटाएं को कैसे रद्द करूं, मैं व्यवसाय नियमों के विरुद्ध क्या हटाया जा रहा है और फिर आवश्यक होने पर हटाने को रद्द करने के लिए एक ट्रिगर बनाना चाहता हूं। कोई विचार?मैं SQL

समाधान ट्रिगर हटाने के बजाय उपयोग किया गया। रोलबैक ट्रैन ने हटा दिया बंद कर दिया। मुझे डर था कि जब मैंने डिलीट किया था तो मुझे एक कैस्केड मुद्दा होगा लेकिन ऐसा नहीं लगता था। शायद एक ट्रिगर खुद को ट्रिगर नहीं कर सकता है।

+0

यह देखने लायक है कि उत्तर निर्धारित करने से पहले अन्य लोग क्या योगदान करते हैं। सवाल एक घंटे से भी कम पुराना है। –

उत्तर

18

INSTEAD OF DELETE (MSDN देखें) का उपयोग करें और ट्रिगर के भीतर निर्णय लें कि आप वास्तव में क्या करना चाहते हैं।

1

ट्रिगर वर्तमान लेनदेन को वापस ला सकता है, जिसका विलोपन रद्द करने का असर होगा। चूंकि उपरोक्त पोस्टर भी कहता है, आप ट्रिगर के बजाय भी उपयोग कर सकते हैं।

1

MSDN प्रलेखीकरण के अनुसार INSTEAD OF DELETE के बारे में चलाता:

The deleted table sent to a DELETE trigger contains an image of the rows as they existed before the DELETE statement was issued.

अगर मैं यह सही ढंग से समझ हटाएँ वास्तव में क्रियान्वित किया जा रहा है। मैं क्या खो रहा हूँ?

वैसे भी, मुझे समझ में नहीं आता कि आप रिकॉर्ड क्यों हटाना चाहते हैं और यदि व्यवसाय नियम पारित नहीं होते हैं तो उन रिकॉर्ड्स को हटा दें। अगर मैं रिकॉर्ड हटाने से पहले व्यवसाय नियमों को पास करता हूं तो मैं कसम खाता हूं कि परीक्षण करना आसान होना चाहिए।

और मैंने कहा होगा कि एक लेनदेन का उपयोग करें, मैंने INSTEAD OF ट्रिगर्स से पहले नहीं सुना है।

+0

समस्या यह है कि एप्लिकेशन उपयोगकर्ता को उन्हें निर्दिष्ट कुछ हटाने की अनुमति देता है लेकिन चूंकि मेरे पास स्रोत कोड नहीं है, इसलिए मैं इसे केवल डीबी स्तर पर रोक सकता हूं। मैं नहीं चाहता कि उपयोगकर्ता उन कार्यों को हटा दें जो उन्हें सौंपे गए हैं जो पूर्ण नहीं हुए हैं। –

7

समाधान ट्रिगर हटाने के बजाय उपयोग किया गया। रोलबैक ट्रैन ने हटा दिया बंद कर दिया। मुझे डर था कि जब मैंने डिलीट किया था तो मुझे एक कैस्केड मुद्दा होगा लेकिन ऐसा नहीं लगता था। शायद एक ट्रिगर खुद को ट्रिगर नहीं कर सकता है। किसी भी तरह, आपकी मदद के लिए सभी को धन्यवाद।

ALTER TRIGGER [dbo].[tr_ValidateDeleteForAssignedCalls] 
on [dbo].[CAL] 
    INSTEAD OF DELETE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @RecType VARCHAR(1) 
    DECLARE @UserID VARCHAR(8) 
    DECLARE @CreateBy VARCHAR(8) 
    DECLARE @RecID VARCHAR(20) 

    SELECT @RecType =(SELECT RecType FROM DELETED) 
    SELECT @UserID =(SELECT UserID FROM DELETED) 
    SELECT @CreateBy =(SELECT CreateBy FROM DELETED) 
    SELECT @RecID =(SELECT RecID FROM DELETED) 

    -- Check to see if the type is a Call and the item was created by a different user 
    IF @RECTYPE = 'C' and not (@[email protected]) 

    BEGIN 
     RAISERROR ('Cannot delete call.', 16, 1) 
     ROLLBACK TRAN 
     RETURN 
    END 

    -- Go ahead and do the update or some other business rules here 
    ELSE 
     Delete from CAL where RecID = @RecID  

END 
+1

यदि आप एक से अधिक रिकॉर्ड हटाने की कोशिश करते हैं तो आपको त्रुटि मिलती है: _Subquery 1 से अधिक मान लौटाता है। यह अनुमति नहीं है जब subquery = =! = <, <= , >,> = या जब subquery अभिव्यक्ति के रूप में प्रयोग किया जाता है ._ तो आपको अन्य तरीकों से अनुमतियों की जांच करने की आवश्यकता है (जैसे _select @C = count (1) हटाए गए से हटाएं ..._) – inon

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