Может ли триггер SQL Server отключить себя или быть отключенным автоматически? - PullRequest
0 голосов
/ 17 июня 2019

У меня есть триггер SQL Server, который генерирует уникальные номера идентификаторов для строк в определенной таблице.

Каждые несколько дней пользователи будут сообщать мне, что он прекратил генерировать идентификаторы.И когда я захожу в базу данных (SSMS) и смотрю на триггер, он отключается.Я включаю его, и обработка возобновляется в обычном режиме.

Насколько я знаю, единственный способ отключить триггер - это обратиться к администратору, щелкнув правой кнопкой мыши и выбрав «отключить» или запуститьсценарий DDL, который отключает его.Никто другой в группе администраторов не допускает отключения триггера.

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

Мне нужен какой-то способ объяснить, как эта штука отключается.

Интернет странно молчит об этом.

РЕДАКТИРОВАТЬ: Файлы журналакажется, нечего сказать по этому поводу.Кроме того, база данных является частью группы доступности AAG.

EDIT2: «код» триггера «голые кости».

ALTER TRIGGER [dbo].[Create_Permalink]
   ON  [dbo].[TABLE_NAME_1]
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    IF EXISTS (SELECT   * FROM TABLE_NAME_1 
                WHERE   (PermaLink IS NULL or Permalink = '')
                AND     Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
                AND     AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
                AND     Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)
    )
    BEGIN

        declare @code nvarchar(32) = '';

        -------------------------------------------------
        -- GENERATE MULTI-PART ALPHANUMERIC IDCODE HERE
        -------------------------------------------------
        -- SET @code = ....Generated Code....


        UPDATE  TABLE_NAME_1 
        SET     PermaLink = @code
        WHERE   (PermaLink IS NULL or Permalink = '')
          AND   Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
          AND   AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
          AND   Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)

    END
END

Я не писал этого, поэтому не имею права голоса вчто он делает.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

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

1 голос
/ 18 июня 2019

В вашем триггере есть явная ошибка.Предполагается, что в каждый момент времени обновляется только одна строка, что не всегда так.Если вы выполняете обновление, затрагивающее несколько строк, то содержимое таблицы inserted будет иметь несколько строк, что означает, что это не удастся:

      AND   Request_ID = (SELECT DISTINCT Request_ID FROM inserted)
      AND   AC_ID = (SELECT DISTINCT AC_ID FROM inserted)
      AND   Leg_ID  = (SELECT DISTINCT Leg_ID FROM inserted)

Будет возвращена ошибка, указывающая, что правая сторонаваше равенство не единственная ценность.

Я не знаю, если это проблема, которую вы видите, но это может быть.Вам действительно нужно это сначала исправить.

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