2012-01-31 8 views
6

Al hacer un script SQL para crear un desencadenante en una tabla, quería comprobar que el desencadenador no existe antes de crearlo. De lo contrario, la secuencia de comandos no se puede ejecutar varias veces.SQL: ¿Por qué es necesario ir precedido de un CREATE TRIGGER GO

Así que agregué una declaración para verificar primero si el activador existe. Después de agregar esa declaración, la instrucción CREATE TRIGGER ya no funciona.

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 

Esto da:

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

La solución sería dejar caer el gatillo existente y crear uno nuevo:

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 

Mi pregunta es: w hy es el primer ejemplo que falla? ¿Qué hay de malo en verificar que exista el disparador?

Respuesta

10

Certain statements need to be the first in a batch (como en, grupo de declaraciones separadas por GO).

Cita:

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER y CREATE VIEW no se pueden combinar con otras declaraciones en un lote. La instrucción CREATE debe iniciar el lote. Todas las demás declaraciones que siguen en ese lote se interpretarán como parte de la definición de la primera declaración CREATE.

1

Es simplemente una de las reglas para lotes de SQL Server (ver):

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

De lo contrario, podría cambiar un objeto, por ejemplo una mesa, y luego hacer referencia al cambio en el mismo lote , antes de que el cambio realmente se hiciera

+0

¿Caería presente el mismo problema que crear? – JeffO

1

Los cambios en el esquema siempre deben ser llamadas por lotes separadas ... Supongo que lo hacen para garantizar que su SELECCIÓN tenga éxito; si modifica el esquema en el mismo lote, es posible que no puedan garantizarlo. Solo una conjetura ...

Cuestiones relacionadas