2012-01-31 25 views
6

前面作出SQL脚本来创建一个表上的触发器时,我想检查之前,我创建它的触发器不存在。否则,该脚本不能多次运行。SQL:为什么一个CREATE TRIGGER需要通过GO

所以我添加了一个语句来首先检查触发器是否存在。添加该语句后,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 hy是第一个失败的例子?检查触发器存在什么问题?

回答

10

Certain statements need to be the first in a batch(如,由GO分隔的语句的组)。

引用:

CREATE DEFAULT,CREATE函数,创建步骤,创建规则,CREATE SCHEMA,CREATE TRIGGER和CREATE VIEW语句不能在一个批处理中的其它语句组合。 CREATE语句必须启动批处理。该批处理中的所有其他语句都将被解释为第一个CREATE语句定义的一部分。

1

架构的变化应该总是单独批次电话......我猜他们这样做是为了gaurantee你的SELECT会成功,如果在同一批次的他们未必能够gaurantee该修改方案。只是猜测...