2017-09-07 6 views
0

나는 모든 데이터베이스가 dbo.SendMail이라는 트리거를 가지고있는 하나의 트리거 (dbo.SendMail 및 다중 데이터베이스 )를 가지고 있습니다.유창한 migrator를 사용하여 트리거가 변경된 경우

나는 데이터베이스 버전을 관리 할 수 ​​FluentMigrator을 사용하고 그리고 난 근처의 시작은 외부 기대, 내가 잘못된 구문 오류주고있다

IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[SendMail]')) 
BEGIN 
    ALTER TRIGGER [dbo].[SendMail] 
    ON [dbo].[Notification] 
    FOR INSERT 
    AS 
    BEGIN 
     some sql code 
    END 
END 

아래에 뭔가를하고 싶어.

이 작업을 수행하는 방법은 무엇입니까?

미리 감사드립니다.

+0

대신에 'OBJECT_ID' 사용 – Sami

+0

시도하고있는 것처럼 꽤 할 수는 없습니다. 트리거의 존재 여부를 확인하고 드롭 한 다음 항상 생성해야합니다. 그렇지 않으면 트리거 내부에서 동적 SQL을 사용하여 트리거를 작성해야합니다. –

+0

@SeanLange하지만 이전에 거기에 있었던 경우에만 트리거를 다시 작성하고 싶었습니다 –

답변

0

이 시도 :

IF OBJECT_ID(N'[dbo].[SendMail]', N'TR') IS NOT NULL 

-- Do whatever 

Else 

-- Do something else 
0

는 몇 가지 동적 SQL과 트리거 코드입니다. 동적 SQL을 사용하여 롤백해야합니다. 오브젝트를 작성하거나 변경하는 것이 일괄 처리의 유일한 명령문이어야하기 때문입니다. IF 문 안에 create/alter 논리를 래핑 할 수 없습니다.

IF OBJECT_ID('SendMail') is not null 
begin 
    declare @SQL nvarchar(max) 
    set @SQL = 'ALTER TRIGGER [dbo].[SendMail] 
    ON [dbo].[Notification] 
    FOR INSERT 
    AS 
    BEGIN 
     some sql code 
    END' 

    exec sp_executesql @SQL 
end