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
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
'
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 .......
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;
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