sourcecode

SQL Server 2005: 트리거를 일시적으로 비활성화하는 T-SQL

copyscript 2023. 8. 12. 10:34
반응형

SQL Server 2005: 트리거를 일시적으로 비활성화하는 T-SQL

명령 배치에 대한 트리거를 비활성화한 다음 배치가 완료되면 활성화할 수 있습니까?

분명 방아쇠를 떨어뜨렸다가 다시 꽂을 수 있을 텐데 다른 방법이 없을까 해서요.

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

때때로 외부 데이터 원본에서 빈 데이터베이스를 채우거나 데이터베이스의 문제를 디버그하기 위해 모든 트리거 및 제약 조건을 비활성화해야 합니다.이를 위해 다음 코드를 사용합니다.

모든 제약 조건 및 트리거를 비활성화하려면:

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"

얼마 전 SQL Server Central에서 해당 솔루션을 찾았지만 원래 솔루션이 완전히 작동하지 않아 Enable 제약 조건 부분을 수정해야 했습니다.

하지만, 이것을 하는 것은 거의 항상 나쁜 생각입니다.데이터베이스의 무결성을 손상시킬 수 있습니다.그 영향을 고려하지 않고 데이터베이스에 확인하지 않고 그것들을 가지고 있는지 확인하지 마세요.

만약 당신이 Matt의 코드를 따른다면, 방아쇠를 다시 켜는 것을 기억하세요.또한 프로세스뿐만 아니라 테이블이 꺼져 있는 동안 모든 사용자가 테이블을 삽입, 업데이트 또는 삭제할 때 트리거를 사용할 수 없으므로, 트리거를 수행해야 하는 경우 데이터베이스가 가장 사용 빈도가 낮은 시간(단일 사용자 모드인 경우)에 트리거를 수행합니다.

대량의 데이터를 가져오기 위해 이 작업을 수행해야 하는 경우 대량 삽입이 트리거를 실행하지 않습니다.그러나 대량 삽입 후 프로세스는 트리거를 실행하거나 실행하지 않고 발생하는 모든 데이터 무결성 문제를 해결해야 합니다.

Matt의 답변을 확장하기 위해, 여기 MSDN에 주어진 예가 있습니다.

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

또 다른 방법은 트리거에 통합된 추가 상태 변수를 사용하여 트리거를 실제로 비활성화하지 않고 효과적으로 비활성화하는 것입니다.

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

상태 변수의 경우 테이블의 잠금 제어 레코드 유형을 읽거나(현재 세션의 컨텍스트에 제한된 경우가 가장 좋음), CONTEX_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

잠재적으로 주요한 단점은 상태 변수 액세스의 복잡성에 따라 트리거가 영구적으로 느려진다는 것입니다.

편집: Samuel Vanga의 놀랍도록 유사한 2008년 게시물에 참조 추가.

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

배치 프로그래밍에 대한 최선의 대답은 아니지만 트리거를 일시적으로 비활성화하는 빠르고 쉬운 방법을 찾는 다른 사람들의 경우 SQL Server Management Studio에서 이 문제를 해결할 수 있습니다.

  1. 테이블에서 트리거 폴더 확장
  2. 트리거를 마우스 오른쪽 버튼으로 클릭합니다.
  3. 무력하게 하는

enter image description here

동일한 프로세스를 수행하여 다시 활성화합니다.

언급URL : https://stackoverflow.com/questions/123558/sql-server-2005-t-sql-to-temporarily-disable-a-trigger

반응형