SQL:为什么CREATE TRIGGER需要以GO开头

dem*_*key 7 sql sql-server triggers

在创建SQL脚本以在表上创建触发器时,我想在创建之前检查触发器是否已经存在.否则脚本无法多次运行.

所以我添加了一个语句来首先检查触发器是否存在.添加该语句后,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
Run Code Online (Sandbox Code Playgroud)

这给出了:

Msg 156, Level 15, State 1, Line 5
Incorrect syntax near the keyword 'TRIGGER'.
Run Code Online (Sandbox Code Playgroud)

解决方案是删除现有触发器,然后创建新触发器:

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
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么第一个例子失败了?检查触发器有什么问题?

Stu*_*Stu 11

某些语句必须是批处理中的第一个语句(例如,由GO分隔的语句组).

引用:

CREATE DEFAULT,CREATE FUNCTION,CREATE PROCEDURE,CREATE RULE,CREATE SCHEMA,CREATE TRIGGER和CREATE VIEW语句不能与批处理中的其他语句组合使用.CREATE语句必须启动批处理.该批次中的所有其他语句将被解释为第一个CREATE语句定义的一部分.