web-dev-qa-db-fra.com

"S'il n'existe pas", l'utilisation de OBJECT_ID () ne fonctionne pas pour les vues et les déclencheurs. Pourquoi?

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

5
SHR

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
10
Scott Hodgin

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')
7
EzLo