2008-09-23 10 views
44

अक्षम करने के लिए आदेशों के बैच के लिए एक ट्रिगर को अक्षम करना संभव है और फिर बैच होने पर इसे सक्षम करना संभव है?एसक्यूएल सर्वर 2005: टी-एसक्यूएल अस्थायी रूप से एक ट्रिगर

मुझे यकीन है कि मैं ट्रिगर छोड़ सकता हूं और इसे फिर से जोड़ सकता हूं लेकिन मैं सोच रहा था कि कोई और तरीका है या नहीं।

उत्तर

57
DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } 
ON { object_name | DATABASE | ALL SERVER } [ ; ] 

http://msdn.microsoft.com/en-us/library/ms189748(SQL.90).aspx

उलटा द्वारा पीछा किया:

ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } 
ON { object_name | DATABASE | ALL SERVER } [ ; ] 

http://msdn.microsoft.com/en-us/library/ms182706(SQL.90).aspx

+0

धन्यवाद! मुझे लगता है कि मेरी साइट पर SQL सर्वर 2005 की भरोसा बहुत अच्छी तरह से दिख रही है। –

+0

कोई चिंता नहीं; एक लंबे समय के लिए एक डीबीए बनें और ये चीजें स्वचालित हो जाती हैं :) –

+0

यानी यदि आप एक ट्रिगर को संशोधित करने के विकल्प का उपयोग करते हैं और लिपि में 'वैकल्पिक ट्रिगर [डीबीओ] होता है। [trgWhatever] चालू [dbo]। [tblWhatever]' तो आप 'अक्षम ट्रिगर [डीबीओ] की आवश्यकता है। [trgWhatever] [dbo] पर। [tblWhatever]' और 'ट्रिगर [डीबीओ] सक्षम करें। [trgWhatever] [dbo] पर। [tblWhatever]' –

15

हालांकि, यह लगभग हमेशा एक बुरा विचार यह करने के लिए है। आप डेटाबेस की अखंडता के साथ गड़बड़ करेंगे। अगर आप उन्हें हैं तो ramifications पर विचार करने और dbas के साथ जांच के बिना ऐसा मत करो।

यदि आप मैट के कोड का पालन करते हैं तो ट्रिगर को वापस चालू करना याद रखें। एएनडी याद रखें कि ट्रिगर को आपकी प्रक्रिया के लिए न केवल बंद करने के दौरान तालिका से डालने, अपडेट करने या हटाने के लिए अक्षम किया गया है, इसलिए यदि यह किया जाना चाहिए, तो घंटों के दौरान ऐसा करें जब डेटाबेस कम से कम सक्रिय हो (और अधिमानतः एकल उपयोगकर्ता मोड में)।

यदि आपको बड़ी मात्रा में डेटा आयात करने के लिए ऐसा करने की आवश्यकता है, तो मान लें कि थोक डालने से ट्रिगर्स को आग नहीं मिलती है। लेकिन फिर थोक प्रविष्टि के बाद आपकी प्रक्रिया को आपके द्वारा पेश की जाने वाली किसी भी डेटा अखंडता समस्याओं को ठीक करना होगा और न ही ट्रिगर्स को फायर करना होगा।

+0

ग्रेट पॉइंट्स। मुझे इसकी आवश्यकता यह थी कि उत्पादन वातावरण से डेटा को एक परीक्षण वातावरण में कॉपी करते समय कुछ एके को ट्रिगर द्वारा रीसेट किया जा रहा था लेकिन किसी अन्य तालिका में संबंधित कॉलम सूट का पालन नहीं कर रहे थे। –

30

कभी-कभी बाहरी डेटा स्रोत से खाली डेटाबेस को पॉप्युलेट करने या डेटाबेस में किसी समस्या को डीबग करने के लिए मुझे सभी ट्रिगर्स और बाधाओं को अक्षम करने की आवश्यकता होती है। ऐसा करने के लिए मैं निम्नलिखित कोड का उपयोग करें:

सभी बाधाओं को निष्क्रिय और चलाता है के लिए:

sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 
sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER all" 

सभी बाधाओं को सक्षम और चलाता है के लिए:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 
sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? ENABLE TRIGGER all" 

मुझे लगता है कि समाधान नहीं मिला कुछ समय पहले SQLServerCentral पर, लेकिन सक्षम बाधाओं को संशोधित करने की आवश्यकता थी क्योंकि मूल व्यक्ति पूरी तरह से काम नहीं करता था

9

मैट के उत्तर को विस्तारित करने के लिए, यहां MSDN पर दिया गया एक उदाहरण दिया गया है।

USE AdventureWorks; 
GO 
DISABLE TRIGGER Person.uAddress ON Person.Address; 
GO 
ENABLE Trigger Person.uAddress ON Person.Address; 
GO 
4

एक और दृष्टिकोण को प्रभावी ढंग से वास्तव में, इसे अक्षम करने के लिए एक अतिरिक्त राज्य चर कि ट्रिगर में शामिल किया जाता है का उपयोग किए बिना ट्रिगर को निष्क्रिय है।

create trigger [SomeSchema].[SomeTableIsEditableTrigger] ON [SomeSchema].[SomeTable] 
for insert, update, delete 
as 
declare 
    @isTableTriggerEnabled bit; 

exec usp_IsTableTriggerEnabled -- Have to use USP instead of UFN for access to #temp 
    @pTriggerProcedureIdOpt = @@procid,  
    @poIsTableTriggerEnabled = @isTableTriggerEnabled out; 

if (@isTableTriggerEnabled = 0) 
    return; 

-- Rest of existing trigger 
go 

राज्य चर एक एक तालिका में ताला नियंत्रण रिकॉर्ड के कुछ प्रकार पढ़ सकता है (सबसे अच्छा करता है, तो वर्तमान सत्र के संदर्भ तक सीमित), CONTEXT_INFO() का उपयोग, या एक विशेष अस्थायी तालिका की उपस्थिति का उपयोग करें नाम (जो पहले से ही सत्र दायरे सीमित है):

create proc [usp_IsTableTriggerEnabled] 
    @pTriggerProcedureIdOpt bigint   = null, -- Either provide this 
    @pTableNameOpt   varchar(300) = null, -- or this 
    @poIsTableTriggerEnabled bit    = null out 
begin 

    set @poIsTableTriggerEnabled = 1; -- default return value (ensure not null) 

    -- Allow a particular session to disable all triggers (since local 
    -- temp tables are session scope limited). 
    -- 
    if (object_id('tempdb..#Common_DisableTableTriggers') is not null) 
    begin 
     set @poIsTableTriggerEnabled = 0; 
     return; 
    end 

    -- Resolve table name if given trigger procedure id instead of table name. 
    -- Google: "How to get the table name in the trigger definition" 
    -- 
    set @pTableNameOpt = coalesce(
     @pTableNameOpt, 
     (select object_schema_name(parent_id) + '.' + object_name(parent_id) as tablename 
      from sys.triggers 
      where object_id = @pTriggerProcedureIdOpt) 
    ); 

    -- Else decide based on logic involving @pTableNameOpt and possibly current session 
end 

तो सभी ट्रिगर निष्क्रिय करने के लिए:

select 1 as A into #Common_DisableTableTriggers; 
-- do work 
drop table #Common_DisableTableTriggers; -- or close connection 

एक संभावित प्रमुख नकारात्मक पक्ष यह है कि ट्रिगर स्थायी रूप से SLOWE है राज्य चर के उपयोग की जटिलता के आधार पर डी नीचे।

संपादित करें: इस अद्भुत समान 2008 post by Samuel Vanga का संदर्भ जोड़ना।

2
ALTER TABLE table_name DISABLE TRIGGER TRIGGER_NAME 
-- Here your SQL query 
ALTER TABLE table_name ENABLE TRIGGER TRIGGER_NAME 
2

नहीं बैच प्रोग्रामिंग के लिए सबसे अच्छा जवाब है, लेकिन एक त्वरित और आसान तरीका अस्थायी रूप से एक ट्रिगर निष्क्रिय करने के लिए की तलाश में इस सवाल खोजने दूसरों के लिए, यह एसक्यूएल सर्वर प्रबंधन स्टूडियो में पूरा किया जा सकता।

  1. ट्रिगर
  2. अक्षम

enter image description here

पुन: सक्षम करने के लिए उसी प्रक्रिया का पालन करें

  • राइट क्लिक करें मेज पर चलाता फ़ोल्डर का विस्तार।

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