Я использовал бы MiscUtil и его дополнительные методы:
foreach(DateTime date in 1.January(2009)
.To(31.December(2009))
.Step(1.Days())
{
Console.WriteLine(date);
}
Я вижу три возможности:
Отключить рекурсию триггера :
Это предотвратит срабатывание триггера для вызова другого триггера или повторного вызова самого себя. Для этого выполните следующую команду:
ALTER DATABASE MyDataBase SET RECURSIVE_TRIGGERS OFF
ИДТИ
Использование триггера INSTEAD OF UPDATE, INSERT
Используя триггер INSTEAD OF
, вы можете управлять обновлением / вставкой любого столбца и даже заменой перед вызовом команды.
Управляйте триггером, предотвращая использование 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
КОНЕЦ
ALTER DATABASE <dbname> SET RECURSIVE_TRIGGERS OFF
ON Допускается рекурсивное срабатывание триггеров AFTER.
OFF Только прямое рекурсивное срабатывание триггеров AFTER не допускается. Чтобы также отключить косвенную рекурсию ПОСЛЕ триггеров установите вложенные запускает параметр сервера в 0 с помощью sp_configure.
Только прямая рекурсия запрещена, если для параметра RECURSIVE_TRIGGERS установлено значение OFF. Чтобы отключить косвенную рекурсию, вы также необходимо установить вложенные триггеры опцию сервера на 0.
Статус этой опции можно определить, исследуя is_recursive_triggers_on в столбце sys.databases или IsRecursiveTriggersEnabled свойство функция DATABASEPROPERTYEX.
Думаю, я понял :)
Когда заголовок «обновляется» (читается: вставлен или обновлен), обновите уникальную тему. Когда триггер запускается во второй раз, поле 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
У вас может быть отдельный столбец NULLABLE, указывающий, был ли установлен UniqueTitle.
Установите для него значение true в триггере, и триггер ничего не сделает, если значение true в "INSERTED" "