programing

테이블에 트리거 SQL 서버 사용 안 함

linuxpc 2023. 5. 1. 20:00
반응형

테이블에 트리거 SQL 서버 사용 안 함

아래와 같이 하나의 proc를 만들고 싶은데 구문에 오류가 있습니다.누가 그 문제를 지적해 줄 수 있습니까?

Create PROCEDURE [dbo].[my_proc] AS

BEGIN

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

END

** Error Message : Incorrect syntax near 'ENABLE'.

대신 다음 명령을 사용합니다.

ALTER TABLE table_name DISABLE TRIGGER tr_name

ALTER TABLE table_name ENABLE TRIGGER tr_name

은 앞줄은다끝합나니다야로로 .;DISABLE 키워드가 아닙니다.예:

BEGIN
;
DISABLE TRIGGER ...

마크가 언급했듯이, 이전 진술은 세미콜론으로 끝나야 합니다.따라서 다음을 사용할 수 있습니다.

; DISABLE TRIGGER dbo.tr_name ON dbo.table_name

새 줄에서 ENABLE TRUGER 또는 DISABLE TRUGER 뒤에 GO를 기록합니다. 예:

DISABLE TRIGGER dbo.tr_name ON dbo.table_name

GO
-- some update statement

ENABLE TRIGGER dbo.tr_name  ON dbo.table_name

GO

다음은 트리거를 활성화하거나 비활성화하는 동적 스크립트입니다.

select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+
Name as EnableScript,*
from sys.triggers t 
where is_disabled = 1

저는 제게 도움이 되는 것을 공유하고 싶었습니다.아이디어 크레딧은 @Siavash와 @Shahab Naseer에게 전달됩니다.

특정 테이블에 대한 트리거 비활성화 및 다시 활성화 스크립트를 작성할 수 있는 기능이 필요했습니다.저는 보통 호랑이들을 멀리하려고 노력하지만, 가끔 호랑이들은 사용하기에 좋을 수도 있습니다.

위 스크립트를 사용하여 테이블 이름으로 필터링할 수 있도록 시스템 개체에 조인을 추가했습니다.이 스크립트는 테이블에 대한 트리거를 비활성화합니다.

select 'alter table '+ (select Schema_name(schema_id) from sys.objects o 
where o.object_id = parent_id) + '.'+object_name(parent_id) + ' ENABLE TRIGGER '+ t.Name as EnableScript,*
from sys.triggers t 
INNER JOIN dbo.sysobjects DS ON DS.id = t.parent_id 
where is_disabled = 0 AND DS.name = 'tblSubContact'

소스에서 직접 ENABLE 트리거를 실행하려는 경우:

우리는 이렇게 쓸 수 없습니다.

Conn.Execute "ENABLE TRIGGER trigger_name ON table_name"

대신, 우리는 다음과 같이 쓸 수 있습니다.

Conn.Execute "ALTER TABLE table_name DISABLE TRIGGER trigger_name"
USE [DatabaseName]
GO

-- HABILITAR TRIGGERS
SELECT 'ALTER TABLE ['+ 
    ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
        + '].[' + OBJECT_NAME(T.[parent_id]) + '] ENABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
        FROM [sys].[triggers] AS T 
            INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
        WHERE T.[is_disabled] = 0 
            --AND DS.[name] = 'TableName'

-- DESHABILITAR TRIGGERS
SELECT 'ALTER TABLE ['+ 
    ( SELECT SCHEMA_NAME(SCHEMA_ID) FROM [sys].[objects] AS O WHERE O.[object_id] = T.[parent_id]) 
        + '].[' + OBJECT_NAME(T.[parent_id]) + '] DISABLE TRIGGER '+ T.[name] + ';' AS [EnableScript], *
        FROM [sys].[triggers] AS T 
            INNER JOIN [sys].[sysobjects] DS ON DS.[id] = T.[parent_id]
        WHERE T.[is_disabled] = 0 
            --AND DS.[name] = 'TableName'

Habilitar 트리거 'ALTER 탭 선택LE ['+]( [sys]에서 SCHEMA_NAME(SCHEMA_ID) 선택).[filename] ASOWH O.[object_id] = T.[parent_id]) + '].[' + OBJECT_NAME(T.[parent_id]) + '] 트리거 '+ T.[name] + ';' AS [EnableScript], * FROM [sys].[트리거] ASTINER JOIN [sys][sysobjects] DSON DS.[id] = T.[parent_id] WHERE T.[is_disabled] = 1 -- 0이 아닌 1이어야 합니다 --AND DS.[name] = 'TableName'

버퍼 상태:

고정됨: 현재 사용됩니다.치료: 버퍼가 이제 고정되지 않았으며 현재(데이터 블록)를 다시 참조하지 않을 경우 즉시 에이징 아웃될 수 있음을 의미합니다.내용이 디스크와 동기화되어 있거나 버퍼에 블록의 CR 스냅샷이 포함되어 있습니다.사용 가능/사용 안 함:인스턴스가 방금 시작되었기 때문에 버퍼가 비어 있음을 의미합니다.이 상태는 버퍼가 사용되지 않았다는 점을 제외하면 치료와 매우 유사합니다.더티: 버퍼가 더 이상 고정되지 않지만 내용(데이터 블록)이 변경되었으므로 만료되기 전에 DBWn에서 디스크로 플러시해야 합니다.버퍼 풀 3개:

기본 데이터베이스 버퍼 캐시 매개 변수 재활용 유지:

DB_CACH_SIZE(BLOCK SIZE는 DB_B에 선언된 크기가 됩니다)LOCK_SIZE) DB_KEEP_CACHE_SIZE DB_2K_CACHE_SIZE DB_4K_CACHE_SIZE DB_8K_CACHE_SIZE DB_16K_CACHE_SIZE DB_RACYCLE_CACH_SIZE DB_BIZE DB_BLOCK_SIZE(나중에 변경할 수 없는 기본 블록 크기)

매개 변수 DB_BLOCK_ 표시크기;

show 매개 변수 db_cache_size;

가장 간단한 방법은 다음과 같습니다.

코드를 사용해 보십시오.

ALTER TRIGGER trigger_name DISABLE

바로 그거야 :)

언급URL : https://stackoverflow.com/questions/1388072/disable-enable-trigger-sql-server-for-a-table

반응형