2017-09-07 1 views
0

J'ai un déclencheur appelé dbo.SendMail et plusieurs bases de données, pas toutes les bases de données ont le déclencheur dbo.SendMail.Alter trigger si existe avec l'utilisation de migrateur fluide

J'utilise FluentMigrator pour gérer les versions de base de données et je veux faire quelque chose comme ci-dessous

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 

il me donne erreur de syntaxe incorrecte près de commencer, Expecting EXTERNE.

est-il possible d'y parvenir?

Merci d'avance.

+0

Utilisez 'OBJECT_ID' à la place – Sami

+0

Vous ne pouvez pas tout à fait faire cela comme vous essayez. Vous devrez soit vérifier l'existence du déclencheur et le supprimer, puis toujours le créer, soit utiliser SQL dynamique à l'intérieur de votre site pour créer le déclencheur. –

+0

@SeanLange mais je voulais seulement recréer le trigger si c'était déjà là –

Répondre

0

Essayez ceci:

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

-- Do whatever 

Else 

-- Do something else 
0

Voici votre code de déclenchement avec une dynamique sql. Vous devez lancer avec SQL dynamique ici parce que la création ou la modification d'objets doit être la seule déclaration dans un lot. Vous ne pouvez pas envelopper la logique create/alter dans une instruction 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