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_id
name
के बजाय के खिलाफ मैच के लिए की आवश्यकता होगी) इस्तेमाल कर सकते हैं और सरल बनाने के लिए, क्योंकि वस्तु नाम को स्कीमा के भीतर अद्वितीय होना आवश्यक है, इसलिए आपको वास्तव में केवल इसके अस्तित्व के लिए परीक्षण करने की आवश्यकता है। अगर किसी कारण से उस नाम के साथ एक अलग ऑब्जेक्ट प्रकार मौजूद है, तो DROP TRIGGER
विफल हो जाएगा क्योंकि अन्य ऑब्जेक्ट अच्छी तरह से ट्रिगर नहीं है ;-)। इसलिए, मैं निम्नलिखित का उपयोग करें:
IF (OBJECT_ID(N'[dbo].[trg]') IS NOT NULL)
BEGIN
DROP TRIGGER [dbo].[trg];
END;
स्रोत
2015-06-25 14:20:19
हाय scrutzky। मुझे त्रुटि मिलती है: 'dbo' के पास गलत वाक्यविन्यास। डेटाबेस में 'trg' नामक एक ऑब्जेक्ट पहले से ही है। – user3399326
@ user3399326 मैं सिर्फ उस त्रुटि को संबोधित करने के मेरा उत्तर अपडेट किया गया। यह 'ड्रॉप ट्रिगर 'का' ON' खंड है जो इसका कारण बन रहा है। –
@scurtzky: आखिर में काम किया। बहुत बहुत धन्यवाद!! – user3399326