web-dev-qa-db-ja.com

OBJECT_ID()を使用した「存在しない場合」は、ビューとトリガーでは機能しません。どうして?

テーブルの場合、「存在しない場合」と「存在する場合」を次のように実装できます。

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

しかし、それはビューとトリガーでまったく同じように機能していません

できます:

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

しかし、私が反対を試みているとき:

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

次のエラーが発生します。

キーワード「view」付近の構文が正しくありません

同じことがトリガーにも当てはまります。私がする時:

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

エラーが発生します:

キーワード「トリガー」の近くの不正な構文

だが:

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

仕事中。

私は何かを逃しましたか?

トリガーとビューに対するテーブルのこの違いを誰かが説明できますか?

注: SQL Server 2012を使用しています

5
SHR

備考の下にある CREATE VIEW からドキュメントを参照する:

CREATE VIEWは、クエリバッチの最初のステートメントである必要があります。

CREATE TRIGGER からドキュメントを参照する

CREATE TRIGGERはバッチの最初のステートメントである必要があり、1つのテーブルにのみ適用できます。

VIEWSTRIGGERSの場合、オブジェクトの存在を確認して1つのバッチにドロップし、GOで区切られた別のバッチにオブジェクトを作成する必要があると思います

例:

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

同じバッチでこれがまだ必要な場合は、動的SQLを使用できます。

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

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