Изменить триггер, если он существует, с использованием свободного миграции

У меня есть один триггер с именем dbo.SendMail и несколько баз данных, не все базы данных имеют триггер 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.

есть ли способ добиться этого?

Заранее спасибо.


person Dhaval Pankhaniya    schedule 07.09.2017    source источник
comment
Вместо этого используйте OBJECT_ID   -  person Ilyes    schedule 07.09.2017
comment
Вы не можете сделать это так, как пытаетесь. Вам нужно будет либо проверить наличие триггера и удалить его, а затем всегда создавать его, либо вам придется использовать динамический sql внутри вашего начала для создания триггера.   -  person Sean Lange    schedule 07.09.2017
comment
@SeanLange, но я хотел воссоздать триггер только в том случае, если он был там ранее   -  person Dhaval Pankhaniya    schedule 07.09.2017
comment
Тогда вам придется использовать динамический sql для вашего оператора alter.   -  person Sean Lange    schedule 07.09.2017
comment
@SeanLange было бы полезно, если бы вы могли привести несколько примеров кода :)   -  person Dhaval Pankhaniya    schedule 08.09.2017


Ответы (2)


Попробуй это:

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

-- Do whatever

Else

-- Do something else
person Ilyes    schedule 07.09.2017

Вот ваш код триггера с динамическим sql. Здесь вы должны использовать динамический sql, потому что создание или изменение объектов должно быть единственным оператором в пакете. Вы не можете обернуть логику создания/изменения внутри оператора IF.

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
person Sean Lange    schedule 08.09.2017