Как я препятствую тому, чтобы триггер базы данных рекурсивно вызвал?

Я использовал бы MiscUtil и его дополнительные методы:

foreach(DateTime date in 1.January(2009)
                         .To(31.December(2009))
                         .Step(1.Days())
{
    Console.WriteLine(date);
}

26
задан D Stanley 1 June 2015 в 18:46
поделиться

4 ответа

Я вижу три возможности:

  1. Отключить рекурсию триггера :

    Это предотвратит срабатывание триггера для вызова другого триггера или повторного вызова самого себя. Для этого выполните следующую команду:

     ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF
    ИДТИ
    
  2. Использование триггера INSTEAD OF UPDATE, INSERT

    Используя триггер INSTEAD OF , вы можете управлять обновлением / вставкой любого столбца и даже заменой перед вызовом команды.

  3. Управляйте триггером, предотвращая использование IF UPDATE

    Тестирование столбца сообщит вам с разумной точностью, вызывает ли триггер сам себя. Для этого используйте предложение IF UPDATE () , например:

     ALTER TRIGGER [dbo]. [TblMediaAfterInsertOrUpdate]
     ВКЛЮЧЕНО [dbo]. [TblMedia]
     ДЛЯ ВСТАВКИ, ОБНОВЛЕНИЯ
    КАК
    НАЧАТЬ
     ВКЛЮЧИТЬ NOCOUNT
     ОБЪЯВЛЯЕМ @IdMedia INTEGER,
     @NewSubject NVARCHAR (200) 
    
     ЕСЛИ ОБНОВИТЬ (UniqueTitle)
     ВОЗВРАЩЕНИЕ;
    
     - Что вставляется новая тема?
     ВЫБЕРИТЕ @IdMedia = IdMedia, @NewSubject = Название
     ОТ ВСТАВЛЕННОГО
    
     - Теперь обновите уникальное поле темы.
     - ПРИМЕЧАНИЕ: dbo.CreateUniqueSubject - это моя собственная функция. 
     - Он просто выполняет некоторые операции со строкой.
     ОБНОВЛЕНИЕ tblMedia
     УСТАНОВИТЬ UniqueTitle = dbo.CreateUniqueSubject (@NewSubject) + 
     CAST ((IdMedia) AS VARCHAR (10))
     ГДЕ tblMedia.IdMedia = @IdMedia
    КОНЕЦ
    
33
ответ дан 28 November 2019 в 06:04
поделиться
ALTER DATABASE <dbname> SET RECURSIVE_TRIGGERS OFF

RECURSIVE_TRIGGERS {ON | OFF}

ON Допускается рекурсивное срабатывание триггеров AFTER.

OFF Только прямое рекурсивное срабатывание триггеров AFTER не допускается. Чтобы также отключить косвенную рекурсию ПОСЛЕ триггеров установите вложенные запускает параметр сервера в 0 с помощью sp_configure.

Только прямая рекурсия запрещена, если для параметра RECURSIVE_TRIGGERS установлено значение OFF. Чтобы отключить косвенную рекурсию, вы также необходимо установить вложенные триггеры опцию сервера на 0.

Статус этой опции можно определить, исследуя is_recursive_triggers_on в столбце sys.databases или IsRecursiveTriggersEnabled свойство функция DATABASEPROPERTYEX.

8
ответ дан 28 November 2019 в 06:04
поделиться

Думаю, я понял :)

Когда заголовок «обновляется» (читается: вставлен или обновлен), обновите уникальную тему. Когда триггер запускается во второй раз, поле uniquesubject обновляется, поэтому он останавливается и выходит из триггера.

Кроме того, я заставил его обрабатывать НЕСКОЛЬКО строк, которые меняются -> Я всегда забываю об этом с триггерами.

ALTER TRIGGER [dbo].[tblMediaAfterInsert] 
   ON  [dbo].[tblMedia]
   FOR INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON

    -- If the Title is getting inserted OR updated then update the unique subject.
    IF UPDATE(Title) BEGIN
        -- Now update all the unique subject fields that have been inserted or updated.
        UPDATE tblMedia 
        SET UniqueTitle = dbo.CreateUniqueSubject(b.Title) + 
                          CAST((b.IdMedia) AS VARCHAR(10))
        FROM tblMedia a
            INNER JOIN INSERTED b on a.IdMedia = b.IdMedia
    END
END
5
ответ дан 28 November 2019 в 06:04
поделиться

У вас может быть отдельный столбец NULLABLE, указывающий, был ли установлен UniqueTitle.

Установите для него значение true в триггере, и триггер ничего не сделает, если значение true в "INSERTED" "

1
ответ дан 28 November 2019 в 06:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: