Pour les tableaux, je peux implémenter "s'il n'existe pas" et "s'il existe" comme suit:
--if table exists - drop
If OBJECT_ID('A','U') is not null
Drop Table [A]
--if table not exists - Create
If OBJECT_ID('A','U') is null
Create Table A([key] varchar(20), [value] varchar(max))
mais cela ne fonctionne pas tout à fait de la même façon sur les vues et les déclencheurs
Je peux faire:
-- if exists - drop
If OBJECT_ID('VA','V') is not null
Drop view [VA]
mais quand j'essaie l'opposé:
-- if not exists - create
If OBJECT_ID('VA','V') is null
Create view [VA] as Select * from [A]
Je reçois l'erreur suivante:
Syntaxe incorrecte près du mot-clé "voir"
Et c'est la même chose avec les déclencheurs. quand je fais:
-- if not exists - create
If OBJECT_ID('Trigger_A_ins','TR') is null
Create trigger [Trigger_A_ins] On [A] instead of insert As
insert into A select * from inserted
Je reçois une erreur:
Syntaxe incorrecte près du mot clé "déclencheur"
Mais:
-- if exists - drop
If OBJECT_ID('Trigger_A_ins','TR') is not null
Drop Trigger Trigger_A_ins
travaille.
Ai-je raté quelque chose?
Quelqu'un peut-il expliquer cette différence entre les tables et les déclencheurs et les vues?
Remarque: J'utilise SQL Server 2012
Référencement de la documentation de CREATE VIEW sous REMARKS:
CREATE VIEW doit être la première instruction d'un lot de requêtes.
Référencement de la documentation de CREATE TRIGGER
CREATE TRIGGER doit être la première instruction du lot et ne peut s'appliquer qu'à une seule table.
Pour VIEWS
et TRIGGERS
, je pense que vous devrez vérifier l'existence de l'objet et déposer dans un lot et les créer dans un autre lot séparés par un GO
Exemple:
IF EXISTS (SELECT * FROM sys.objects WHERE [name] = '[dbo].[trg]' AND [type] = 'TR')
DROP TRIGGER [dbo].[trg] ON [dbo].[tbl]
GO
CREATE TRIGGER [dbo].[trg] ON [dbo].[tbl]
AFTER DELETE
AS
BEGIN
//
END
GO
Si vous en avez toujours besoin sur le même lot, vous pouvez utiliser SQL dynamique.
If OBJECT_ID('vTest','V') is not null
DROP VIEW vTest
EXEC('CREATE VIEW vTest AS SELECT TOP 1 * FROM SomeTable')