2015-06-25 16 views
10

बनाएं मैं यह जांचना चाहता हूं कि ट्रिगर [tbl] पर मौजूद है या नहीं और दूसरा बनाएं। मैंने इस तरह से कोशिश की लेकिन काम नहीं किया। मैं क्या गलत कर रहा हूं?मौजूद होने पर ट्रिगर ड्रॉप करें और

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = '[dbo].[trg]' AND [type] = 'TR') 
     DROP TRIGGER [dbo].[trg] ON [dbo].[tbl] 
GO 
CREATE TRIGGER [dbo].[trg] ON [dbo].[tbl] 
AFTER DELETE 
AS 
BEGIN 
    // 
END 
GO 

उत्तर

22

sys.objects में [name] क्षेत्र केवल वास्तविक नाम शामिल होंगे (अर्थात trg), नहीं स्कीमा (इस मामले में अर्थात dbo) या किसी भी पाठ क्वालिफायर (अर्थात [ और ] इस मामले में) भी शामिल है।

और, के बाद से ट्रिगर अपने आप में एक वस्तु (अनुक्रमित के विपरीत) है आप DROP TRIGGER के लिए तालिका नाम निर्दिष्ट नहीं करते। तो आपको ON खंड को निकालना होगा (जिसका उपयोग केवल डीडीएल और लॉगऑन ट्रिगर्स के साथ किया जाता है)।

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N'trg' AND [type] = 'TR') 
BEGIN 
     DROP TRIGGER [dbo].[trg]; 
END; 

कृपया ध्यान दें कि आप वस्तु नाम स्ट्रिंग एक N साथ शाब्दिक उपसर्ग चाहिए, क्योंकि [name] क्षेत्र एक sysname डेटाप्रकार जो NVARCHAR(128) के बराबर है।

IF EXISTS (SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N'[dbo].[trg]') 
       AND [type] = 'TR') 
BEGIN 
     DROP TRIGGER [dbo].[trg]; 
END; 

:

आप स्कीमा नाम शामिल करने के लिए करना चाहता था, तो आप OBJECT_ID() समारोह जो स्कीमा नाम और पाठ क्वालिफायर के लिए अनुमति नहीं है (आप तो object_idname के बजाय के खिलाफ मैच के लिए की आवश्यकता होगी) इस्तेमाल कर सकते हैं और सरल बनाने के लिए, क्योंकि वस्तु नाम को स्कीमा के भीतर अद्वितीय होना आवश्यक है, इसलिए आपको वास्तव में केवल इसके अस्तित्व के लिए परीक्षण करने की आवश्यकता है। अगर किसी कारण से उस नाम के साथ एक अलग ऑब्जेक्ट प्रकार मौजूद है, तो DROP TRIGGER विफल हो जाएगा क्योंकि अन्य ऑब्जेक्ट अच्छी तरह से ट्रिगर नहीं है ;-)। इसलिए, मैं निम्नलिखित का उपयोग करें:

IF (OBJECT_ID(N'[dbo].[trg]') IS NOT NULL) 
BEGIN 
     DROP TRIGGER [dbo].[trg]; 
END; 
+0

हाय scrutzky। मुझे त्रुटि मिलती है: 'dbo' के पास गलत वाक्यविन्यास। डेटाबेस में 'trg' नामक एक ऑब्जेक्ट पहले से ही है। – user3399326

+0

@ user3399326 मैं सिर्फ उस त्रुटि को संबोधित करने के मेरा उत्तर अपडेट किया गया। यह 'ड्रॉप ट्रिगर 'का' ON' खंड है जो इसका कारण बन रहा है। –

+0

@scurtzky: आखिर में काम किया। बहुत बहुत धन्यवाद!! – user3399326

0

तुम कोशिश कर सकते

SELECT * FROM sys.objects WHERE [name] = PARSENAME('[dbo].[trg]',1) AND [type] = 'TR' 

संपादित करें:

खैर srutzky पहले से ही आप इस सवाल का जवाब और अच्छी तरह से बताया गया है, आप की मदद से नाम पार्स कर सकते हैं दे दी है PARSENAME

+0

क्यों parsename से परेशान? बस स्कीमा ले लो। :) –

+0

@SeanLange यह सच है, बस अतिरिक्त जानकारी बहुत थोड़ी चोट नहीं होगा =) – mxix

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