2012-03-09 8 views
10

मेरा आवेदन एक SQL सर्वर डीबी पर आधारित है।डेटाबेस पर सक्रिय ट्रिगर्स की सूची कैसे प्राप्त करें?

सभी ग्राहकों के अनुकूलन को छोड़कर एक ही डीबी है।

कुछ अनुकूलन में शामिल हैं: नई टेबल, संशोधित टेबल, कस्टम दृश्य, कस्टम से चलाता है ...

जब मैं सॉफ़्टवेयर अद्यतन कुछ स्क्रिप्ट क्रियान्वित कर रहे हैं चलाते हैं। स्क्रिप्ट होने के बाद अब मैं मैन्युअल रूप से ट्रिगर्स को अक्षम करता हूं और पुनः सक्षम करता हूं।

वैसे भी मैं स्वचालित रूप से सभी ट्रिगर्स को अक्षम करना चाहता हूं (जो सक्षम हैं, उनमें से कुछ पहले ही अक्षम हो सकते हैं) और फिर अंत में उन्हें पुनः सक्षम कर सकते हैं।

पहिया को फिर से शुरू करने के लिए, यह कैसे करें?

वर्तमान डीबी पर केवल सक्रिय ट्रिगर्स कैसे प्राप्त करें?

एक बार मैं यह मिल गया मैं प्रोग्राम के रूप में बना सकते हैं और

DISABLE TRIGGER triggername ON TABLENAME 

ENABLE TRIGGER triggername ON TABLENAME 
+0

संभव डुप्लिकेट: जाँच एक उत्प्रेरक है कि क्या सक्षम या अक्षम?] (Http: // stackoverflow।कॉम/प्रश्न/8136 9 37/एसक्यूएल-सर्वर-चेक-चाहे-ए-ट्रिगर-सक्षम-या-अक्षम) – michaelAngelo

उत्तर

19
select objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 

1 सच मतलब है, 0 झूठी जाहिर

उपयोग जेफ हे की क्वेरी का अर्थ है और यह

थोड़ा संशोधित करने या एक जहां खंड रूप में जोड़ें।

where TRIG.is_disabled = 0 -- or 1 depends on what you want 
+0

मैं इसे उत्तर के रूप में चुनता हूं भले ही सभी सही थे, यह बस "सही" है। – LaBracca

+1

नोट: "डेटाबेस ट्रिगर" में कोई संबंधित तालिका नहीं है, इस प्रकार इसका "parent_id" 0 है। इस प्रकार उपरोक्त "आंतरिक शामिल" मेल नहीं खाएगा। बस भावी पाठकों के लिए यह स्वीकार्य उत्तर है। – granadaCoder

5
SELECT 
     TAB.name as Table_Name 
    , TRIG.name as Trigger_Name 
FROM [sys].[triggers] as TRIG 
inner join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 
3
SELECT 
    TAB.name as Table_Name, 
    TRIG.name as Trigger_Name, 
    Comments.Text TriggerText 
FROM [sys].[triggers] as TRIG 
    Inner Join sys.tables as TAB on TRIG.parent_id = TAB.object_id 
    Inner Join syscomments Comments On TRIG.object_id = Comments.id 
WHERE 
    TRIG.is_disabled = 0; 

पूर्ण समाधान

2
select * from sys.triggers 

यहाँ object_id तालिका के लिए है, इसलिए sys.table में शामिल होने से आप तालिका नाम

0

यहाँ प्राप्त कर सकते हैं है क्वेरी होता है कि जब आप करते हैं एसएसएमएस में "डेटाबेस ट्रिगर्स" पर रीफ्रेश करें।

SELECT 
tr.name AS [Name], 
'Server[@Name=' + quotename(CAST(
     serverproperty(N'Servername') 
     AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/DdlTrigger[@Name=' + quotename(tr.name,'''') + ']' AS [Urn], 
tr.is_disabled AS [IsEnabled] 
FROM 
sys.triggers AS tr 
WHERE 
(tr.parent_class = 0) 
ORDER BY 
[Name] ASC 

इसका उपयोग करके, मैंने डेटाबेस ट्रिगर्स को शामिल करने के लिए एक संस्करण (जो स्वीकार किए गए उत्तर को बढ़ाता है) बनाया है।

बाएं शामिल हों और कोलेसे चेक देखें।

SELECT 
     COALESCE(TAB.name, 'DATABASE') as TargetObjectName 
    , TRIG.name as Trigger_Name 
    , TRIG.is_disabled --or objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 
    -- select * 
FROM [sys].[triggers] as TRIG 
left join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 
WHERE 
/* (TRIG.parent_class = 0) and */ 
TRIG.is_disabled = 0 
1
select so.name, text 
from sysobjects so, syscomments sc 
where type = 'TR' 
and so.id = sc.id 
and text like '%related_table_name%' 
+0

यह मेरे 2005 डेटाबेस के लिए बहुत अच्छा काम किया। धन्यवाद। –

0

// आपकी डाटाबेस उपयोग [डेटाबेस नाम] का प्रयोग करें

sys.triggers से * का चयन करें जहां is_disaabled = 0

[SQL सर्वर के
+0

क्या आप अपने उत्तर पर विस्तृत कर सकते हैं? –

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