2012-01-31 19 views
6

Quando si crea uno script SQL per creare un trigger su una tabella, volevo controllare che il trigger non esista già prima di crearlo. Altrimenti lo script non può essere eseguito più volte.SQL: Perché un CREATE TRIGGER deve essere preceduto da GO

Quindi ho aggiunto una dichiarazione per verificare prima se il trigger esiste. Dopo aver aggiunto quella dichiarazione, l'istruzione CREATE TRIGGER non funziona più.

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 

Questo dà:

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

La soluzione sarebbe quella di abbandonare il grilletto esistente e quindi creare il nuovo:

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 

La mia domanda è: w hy è il primo esempio che fallisce? Cosa c'è di così sbagliato nel controllare che il trigger esista?

risposta

10

Certain statements need to be the first in a batch (come in, gruppo di istruzioni separate da GO).

Citazione:

CREATE DEFAULT CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER e CREATE vista non possono essere combinati con altre dichiarazioni in un batch. L'istruzione CREATE deve avviare il batch. Tutte le altre istruzioni che seguono in quel batch verranno interpretate come parte della definizione della prima istruzione CREATE.

1

E 'semplicemente una delle regole per lotti di SQL Server (vedi):

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

caso contrario, si potrebbe cambiare un oggetto, ad esempio un tavolo, e quindi fare riferimento alla variazione dello stesso lotto , prima che il cambiamento fosse effettivamente fatto.

+0

Presenteresti lo stesso problema di quello che crei? – JeffO

1

Le modifiche dello schema devono sempre essere chiamate batch separate ... Immagino che lo facciano per garantire che il tuo SELECT avrà successo, se modifichi lo schema nello stesso batch potrebbe non essere in grado di garantirlo. Solo un'ipotesi ...

Problemi correlati