web-dev-qa-db-fra.com

Comment ajouter "IF NOT EXISTS" pour créer une instruction de déclenchement

J'utilise SQL Server 2008 R2. Plus précisément, Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 2 avril 2010 15:48:46 Copyright (c) Microsoft Corporation Édition Standard (64 bits) sur Windows NT 6.1 (Build 7601: Service Pack 1 ) (Hyperviseur). Je suis nouveau sur le serveur SQL et les procédures/déclencheurs. J'ai le code suivant pour créer un déclencheur (ça marche):

CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] 
   ON  [dbo].[PupilWithdrawalReason] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
        UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() 
        WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted)
END

Comment créer de manière conditionnelle uniquement si le déclencheur n'existe pas encore? Qu'est-ce que je fais mal ici? Stackoverflow a de bons exemples de "si pas existe", mais je ne peux pas obtenir que cela fonctionne en conjonction avec un CREATE. Voici un de mes efforts infructueux:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'TR' AND name = 'Insert_WithdrawalCodes')
   exec('CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] ON  [dbo].[PupilWithdrawalReason] AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted) END')
GO
27
thebiggestlebowski
IF EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[TRIGGERNAME]'))
DROP TRIGGER [dbo].[TRIGGERNAME]
go
IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TABLENAME]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
CREATE   TRIGGER [dbo].[TRIGGERNAME] ON [dbo].[TABLENAME] FOR INSERT, UPDATE 

AS ...

END

Sur la base de votre question mise à jour ... essayez ceci:

IF NOT EXISTS (select * from sys.objects where type = 'TR' and name = 'Insert_WithdrawalCodes')
EXEC dbo.sp_executesql @statement = N'

CREATE TRIGGER [dbo].[Insert_WithdrawalCodes] 
   ON  [dbo].[PupilWithdrawalReason] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
        UPDATE [dbo].[PupilWithdrawalReason] SET DateCreated=dbo.SYSTEMTIME() 
        WHERE WithdrawalCodeID IN (SELECT WithdrawalCodeID FROM inserted)
END


 '
60
JStevens

Le meilleur moyen consiste à vérifier les objets et à les supprimer s'ils existent avant de les créer. 

Plutôt que de ne pas le créer du tout s'il existe, je l'aborderais dans l'autre sens, le laisser tomber s'il existe, puis le créer. 

Normalement, dans les longs scripts, si vous souhaitez mettre à jour la définition d'un déclencheur, vous devez simplement l'ajouter à la fin de ce script et votre définition de déclencheur sera mise à jour. 

Donc, l'approche devrait être create the object but drop it if it already exists plutôt que dont create it at all if it already exists

IF OBJECT_ID ('[Insert_WithdrawalCodes] ', 'TR') IS NOT NULL
   DROP TRIGGER [Insert_WithdrawalCodes];
GO

CREATE TRIGGER .......
12
M.Ali

Certaines instructions telles que CREATE TRIGGER doivent être les premières d'un lot (comme dans un groupe d'instructions séparées par GO).

https://msdn.Microsoft.com/en-us/library/ms175502.aspx

Sinon, vous pouvez le faire

IF NOT EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   type = 'TR'
                    AND name = 'Insert_WithdrawalCodes' ) 
BEGIN
    EXEC ('CREATE TRIGGER Insert_WithdrawalCodes ON ...');
END;
7
Neel

Vérifier si le déclencheur existe

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = 
                 N'[Trigger_Name]' AND [type] = 'TR')
 BEGIN
 DROP TRIGGER [Trigger_Name]
 Print('Trigger dropped => [Schema].[Trigger_Name]')
 END
 GO

Vérifiez si la procédure stockée existe pour IF, également en cliquant sur le lien ci-dessous http://www.gurujipoint.com 2017/05/check-if-exist-for-trigger-function-and.html

0
Jatin Phulera