Как поместить CREATE TRIGGER в блок TRY-CATCH с помощью TRANSACTION? - PullRequest
0 голосов
/ 22 марта 2019

Я не опытный программист в SQL и, возможно, мой вопрос глуп, но я не нашел ответа в Google.У нас есть некоторая конструкция SQL для реализации пакетов изменений:

...
BEGIN TRY
    BEGIN TRANSACTION;
    <User Code Is Here>
    ...
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ...
END CATCH;
...

Как я могу поместить цепочку блоков CREATE TRIGGER вместо <User Code Is Here> без ошибок:

-- Table1
CREATE TRIGGER trTable1_Dates ON dbo.Table1
AFTER INSERT, UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   ...
   SET NOCOUNT OFF;
END
GO
...
-- TableN
CREATE TRIGGER trTableN_Dates ON dbo.TableN
AFTER INSERT, UPDATE
AS
BEGIN
   SET NOCOUNT ON;
   ...
   SET NOCOUNT OFF;
END
GO

Цельсоздать все триггеры или ничего и напечатать сообщение в блоке кода CATCH, если произойдет ошибка.

Отредактировано

Ошибки:

  1. Вкл.первый триггер BEGIN: SQL80001: Неверный синтаксис рядом с «НАЧАЛО».Ожидается EXTERNAL.
  2. После первого запуска: GO: SQL80001: Неверный синтаксис рядом с GO.
  3. END TRY: SQL80001: Неверный синтаксис рядом с «TRY».Ожидается конверсия.
  4. END CATCH: SQL80001: Неверный синтаксис рядом с CATCH.Ожидается разговор.

1 Ответ

3 голосов
/ 22 марта 2019

Вам необходимо запускать каждый оператор create table в отдельной области действия / пакете (потому что это должен быть первый оператор в пакете).Поэтому вам придется избегать любых кавычек в определениях триггеров:

BEGIN TRY
    BEGIN TRANSACTION;
    exec sp_executesql N'CREATE TRIGGER trTable1_Dates ON dbo.Table1
    AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       //An empty string in here has to be '''' to escape the quotes
       SET NOCOUNT OFF;
    END'

    exec sp_executesql N'CREATE TRIGGER trTableN_Dates ON dbo.TableN
    AFTER INSERT, UPDATE
    AS
    BEGIN
       SET NOCOUNT ON;
       ...
       SET NOCOUNT OFF;
    END'
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    ...
END CATCH;

Транзакции ортогональны пакетам и вложенным областям, поэтому транзакция охватывает все действия, которые происходят внутри каждой EXEC.

...