मैं एकल डेटाबेस में सभी ट्रिगर कैसे छोड़ सकता हूं?


17

मेरे पास 104 ट्रिगर्स के साथ एक डेटाबेस है, क्या 'system_db_audits' नामक एकल डेटाबेस से एकल कमांड के साथ सभी ट्रिगर्स को हटाने का एक तरीका है?

जवाबों:


29

आप sys.triggersक्वेरी का निर्माण करने के लिए डायनेमिक SQL और DMV का उपयोग कर सकते हैं।

is_ms_shippedSQL सर्वर के साथ भेजे गए किसी भी ट्रिगर को बाहर करता है।
parent_class_descडेटाबेस स्तर के बजाय ऑब्जेक्ट स्तर ट्रिगर के लिए फ़िल्टर।

PRINTएक EXECबार बदलने के बाद आप आउटपुट से खुश हैं।

USE system_db_audits;
GO

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += 
    N'DROP TRIGGER ' + 
    QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + N'.' + 
    QUOTENAME(t.name) + N'; ' + NCHAR(13)
FROM sys.triggers AS t
WHERE t.is_ms_shipped = 0
  AND t.parent_class_desc = N'OBJECT_OR_COLUMN';

PRINT @sql;

5

Sys.Triggersमेटा डेटा टेबल का उपयोग करें जिसमें एक वस्तु है जो एक ट्रिगर है

  1. यहाँ दिखाए गए टूलबार बटन पर क्लिक करके आउटपुट मोड को टेक्स्ट में बदलें:

यहां छवि विवरण दर्ज करें

  1. इस लिपि को निष्पादित करें:

    USE YourDBName
    GO
    SELECT ' GO ' + Char(10) + Char(13) + 'DROP TRIGGER ' 
        + QUOTENAME(OBJECT_SCHEMA_NAME(O.[object_id])) + '.' 
        + QUOTENAME(name)
    FROM sys.sql_modules as M 
        INNER JOIN sys.triggers as O 
            ON M.object_id = O.object_id; 
  2. आउटपुट को एक नई SQL सर्वर प्रबंधन स्टूडियो विंडो में कॉपी करें, सत्यापित करें कि कोड आपके द्वारा अपेक्षित कार्यों को निष्पादित करता है, और निष्पादित करें।


हालांकि DROP TRIGGERबयानों को टर्मिनेटर की आवश्यकता नहीं है ;?
ypercube y

MSDN कहता है: Transact-SQL स्टेटमेंट टर्मिनेटर। हालाँकि, SQL सर्वर के इस संस्करण में अधिकांश कथनों के लिए अर्धविराम की आवश्यकता नहीं है, भविष्य के संस्करण में इसकी आवश्यकता होगी।
AA.SC

2

यदि आप एक केंद्रीय सर्वर [सर्वरए] पर एक SQL नौकरी चलाना चाहते हैं, तो ट्रिगर हटाने का कार्य करें, मैं आपको एक PowerShell संस्करण प्रदान करूंगा, जिसमें यह माना जाएगा कि आपके पास SQL ​​Server 2012 में (या ऊपर) उदाहरण SQL Server मॉड्यूल के साथ स्थापित है [ServerA]

कहते हैं कि आप [ServerB] SQL सर्वर उदाहरण (SQL Server 2005+) पर [AdventureWorks] डेटाबेस में सभी ट्रिगर हटाना चाहते हैं।

आप निम्नलिखित PS को [ServerA] पर चला सकते हैं:

import-module sqlps -DisableNameChecking;
$db=get-item -Path "sqlserver:\sql\ServerB\default\databases\AdventureWorks";

#before deletion, you can check that triggers do exist
$db.tables.triggers | select name

#now delete
$db.tables.triggers |Where-Object {-not $_.IsSystemObject } | foreach-object {$_.drop()};

#check after deletion
$db.tables.triggers | select name;

कृपया अपने स्वयं के मूल्यों के साथ ServerB और AdventureWorks को बदलना न भूलें ।

यह काफी लचीला समाधान है जिसे आप आसानी से अन्य विभिन्न आवश्यकताओं के अनुकूल बना सकते हैं, जैसे कि केवल डिलीट ट्रिगर्स टेबल के एक विशिष्ट सेट से संबंधित हैं, या अक्षम करें (डिलीट के बजाय) कुछ विशिष्ट ट्रिगर्स आदि।

कड़ाई से बोलते हुए, @Mark Sinkinson द्वारा प्रदान किए गए समाधान सही नहीं हैं क्योंकि आवश्यकता है 'system_db_audits' db पर ट्रिगर को हटाने की नहीं है, बल्कि 'system_db_audits' से किसी अन्य db में ट्रिगर को हटाने की है। इसका मतलब है कि आपको @Mark Sinkinson द्वारा प्रदान किए गए "डायनामिक sql" को लपेटने के लिए 'system_db_audits' में एक डायनामिक sql बनाने की जरूरत है ताकि यह मान लिया जाए कि दोनों 'system_db_audits' और लक्ष्य db एक ही sql सर्वर उदाहरण पर हैं। अन्यथा यदि दो डीबीएस एक ही उदाहरण पर नहीं हैं, तो डिलीटेशन को संभालने के लिए यह बहुत "बदसूरत" होगा (जैसे कि लिंक किए गए सर्वर आदि के माध्यम से)। इस तरह के परिदृश्य में, PS एक सुरुचिपूर्ण समाधान है, चाहे वह लक्ष्य db हो या समान sql उदाहरण पर नहीं हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.