2012-01-31 12 views
6

SQLスクリプトを作成してテーブルにトリガを作成するとき、トリガが作成される前にトリガが存在していないことを確認する必要がありました。それ以外の場合は、スクリプトを複数回実行することはできません。SQL:CREATE TRIGGERに先行する必要がある理由

トリガーが存在するかどうか最初に確認するステートメントを追加しました。その文を追加した後、CREATE TRIGGER文は機能しなくなりました。

IF NOT EXISTS (SELECT name FROM sysobjects 
       WHERE name = 'tr_MyTable1_INSERT' AND type = 'TR') 
BEGIN 
    CREATE TRIGGER tr_MyTable1_INSERT 
     ON MyTable1 
     AFTER INSERT 
    AS 
    BEGIN 
     ... 
    END 
END 
GO 

これが与える:

Msg 156, Level 15, State 1, Line 5 
Incorrect syntax near the keyword 'TRIGGER'. 

をソリューションは、既存のトリガーを削除してから新しいものを作成するために、次のようになります。

IF EXISTS (SELECT name FROM sysobjects 
      WHERE name = 'tr_MyTable1_INSERT' AND type = 'TR') 
    DROP TRIGGER tr_MyTable1_INSERT 
GO 
CREATE TRIGGER tr_MyTable1_INSERT 
    ON MyTable1 
    AFTER INSERT 
AS 
BEGIN 
    ... 
END 
GO 

私の質問があります:w最初の例は失敗ですか?トリガーが存在するかどうかチェックするのは何が問題なのですか?

答えて

10

Certain statements need to be the first in a batch(GOで区切られた文のグループのように)。

引用:

DEFAULTをCREATE、CREATE FUNCTIONを、CREATE PROCEDUREを、RULEをCREATE、SCHEMAのCREATE、TRIGGERを作成し、CREATE VIEW文は、バッチ内の他の文と組み合わせることはできません。 CREATEステートメントはバッチを開始する必要があります。そのバッチに続く他のすべてのステートメントは、最初のCREATEステートメントの定義の一部として解釈されます。

1

これは単に、SQL Serverのバッチのためのルールのいずれか(参照)です。

http://msdn.microsoft.com/en-us/library/ms175502.aspx

は、そうでなければ、あなたがテーブルを言う、オブジェクトを変更することができ、その後、同じバッチで変更を参照してください。実際に変更が行われる前に

+0

作成と同じ問題が発生しますか? – JeffO

1

スキーマの変更は常に個別のバッチコールでなければなりません...同じバッチでスキーマを変更すると、SELECTが成功すると推測しています。ちょうど推測...

関連する問題