it-swarm.com.de

"Wenn nicht vorhanden" mit OBJECT_ID () funktioniert nicht für Ansichten und Trigger. Warum?

Für Tabellen kann ich "falls nicht vorhanden" und "falls vorhanden" wie folgt implementieren:

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

bei Ansichten und Triggern funktioniert dies jedoch nicht ganz gleich

Ich kann:

-- if exists - drop
If OBJECT_ID('VA','V') is not null
Drop view [VA]

aber wenn ich das Gegenteil versuche:

-- if not exists - create
If OBJECT_ID('VA','V') is null
Create view [VA] as Select * from [A] 

Ich erhalte den folgenden Fehler:

Falsche Syntax in der Nähe des Schlüsselworts 'Ansicht'

Und das Gleiche gilt für Auslöser. wenn ich es tue:

-- 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

Ich erhalte eine Fehlermeldung:

Falsche Syntax in der Nähe des Schlüsselworts 'Trigger'

Aber:

-- if exists - drop
If OBJECT_ID('Trigger_A_ins','TR') is not null
Drop Trigger Trigger_A_ins

funktioniert.

Habe ich etwas verpasst?

Kann jemand diesen Unterschied zwischen Tabellen für Trigger und Ansichten erklären?

Hinweis : Ich verwende SQL Server 2012

5
SHR

Verweisen auf die Dokumentation von CREATE VIEW unter BEMERKUNGEN:

Die CREATE VIEW muss die erste Anweisung in einem Abfragebatch sein.

Verweisen auf die Dokumentation von CREATE TRIGGER

CREATE TRIGGER muss die erste Anweisung im Stapel sein und kann nur für eine Tabelle gelten.

Für VIEWS und TRIGGERS müssen Sie wahrscheinlich die Existenz des Objekts überprüfen und einen Stapel ablegen und in einem anderen Stapel erstellen, der durch ein GO getrennt ist

Beispiel:

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

Wenn Sie dies weiterhin für denselben Stapel benötigen, können Sie dynamisches SQL verwenden.

If OBJECT_ID('vTest','V') is not null
    DROP VIEW vTest

EXEC('CREATE VIEW vTest AS SELECT TOP 1 * FROM SomeTable')
7
EzLo