テーブルの場合、「存在しない場合」と「存在する場合」を次のように実装できます。
--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を使用しています
備考の下にある CREATE VIEW からドキュメントを参照する:
CREATE VIEWは、クエリバッチの最初のステートメントである必要があります。
CREATE TRIGGER からドキュメントを参照する
CREATE TRIGGERはバッチの最初のステートメントである必要があり、1つのテーブルにのみ適用できます。
VIEWS
とTRIGGERS
の場合、オブジェクトの存在を確認して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
同じバッチでこれがまだ必要な場合は、動的SQLを使用できます。
If OBJECT_ID('vTest','V') is not null
DROP VIEW vTest
EXEC('CREATE VIEW vTest AS SELECT TOP 1 * FROM SomeTable')