SQL: почему CREATE TRIGGER должен предшествовать GO - PullRequest
7 голосов
/ 31 января 2012

При создании сценария 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

Это дает:

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

Мой вопрос : почему первый пример терпит неудачу?Что такого плохого в проверке существования триггера?

Ответы [ 3 ]

11 голосов
/ 31 января 2012

Некоторые операторы должны быть первыми в пакете (как в группе операторов, разделенных GO).

Цитата:

Операторы CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER и CREATE VIEW нельзя объединять с другими операторами в пакете. Оператор CREATE должен запустить пакет. Все остальные операторы, которые следуют в этом пакете, будут интерпретированы как часть определения первого оператора CREATE.

1 голос
/ 31 января 2012

Изменения схемы всегда должны быть отдельными пакетными вызовами ... Я предполагаю, что они делают это, чтобы гарантировать, что ваш SELECT будет успешным, если вы измените схему в том же пакете, они не смогут это гарантировать.Просто предположение ...

1 голос
/ 31 января 2012

Это просто одно из правил для пакетов SQL Server (см.):

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

В противном случае вы можете изменить объект, скажем таблицу, а затем сослаться на изменение в том же пакете до того, как оно действительно будет сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...