2017-09-07 12 views
0

dbo.SendMailと複数のデータベースと呼ばれるトリガーが1つあります。 すべてのデータベースがトリガーdbo.SendMailを持っているわけではありません。流暢な移行者を使用してトリガーを変更した場合

私は、データベースのバージョンを管理するために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 

の下に、それは近くEXTERNAL期待し、開始私にエラー不正な構文を与えているような何かをしたいです。

これを達成する方法はありますか?

ありがとうございます。

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

-- Do whatever 

Else 

-- Do something else 
+0

代わりに 'OBJECT_ID'を使用してください – Sami

+0

あなたは試しているようにこれを行うことはできません。あなたは、トリガの存在をチェックし、それをドロップし、それから常にそれを作成するか、トリガを作成するためにあなたのbegin内でダイナミックSQLを使用する必要があります。 –

+0

@SeanLangeしかし、私はそれが以前にあった場合にのみトリガーを再作成したい –

答えて

0

はこれを試してみてください。オブジェクトの作成または変更はバッチ内の唯一のステートメントでなければならないため、動的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 
0

ここではいくつかの動的SQLを使用して、トリガ・コードがある:

関連する問題