मेरे पास 104 ट्रिगर्स के साथ एक डेटाबेस है, क्या 'system_db_audits' नामक एकल डेटाबेस से एकल कमांड के साथ सभी ट्रिगर्स को हटाने का एक तरीका है?
मेरे पास 104 ट्रिगर्स के साथ एक डेटाबेस है, क्या 'system_db_audits' नामक एकल डेटाबेस से एकल कमांड के साथ सभी ट्रिगर्स को हटाने का एक तरीका है?
जवाबों:
आप sys.triggers
क्वेरी का निर्माण करने के लिए डायनेमिक SQL और DMV का उपयोग कर सकते हैं।
is_ms_shipped
SQL सर्वर के साथ भेजे गए किसी भी ट्रिगर को बाहर करता है।
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;
Sys.Triggers
मेटा डेटा टेबल का उपयोग करें जिसमें एक वस्तु है जो एक ट्रिगर है
इस लिपि को निष्पादित करें:
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;
आउटपुट को एक नई SQL सर्वर प्रबंधन स्टूडियो विंडो में कॉपी करें, सत्यापित करें कि कोड आपके द्वारा अपेक्षित कार्यों को निष्पादित करता है, और निष्पादित करें।
यदि आप एक केंद्रीय सर्वर [सर्वरए] पर एक 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 उदाहरण पर नहीं हो।
DROP TRIGGER
बयानों को टर्मिनेटर की आवश्यकता नहीं है;
?