Проблемы с SQL триггерами - PullRequest
       1

Проблемы с SQL триггерами

0 голосов
/ 07 февраля 2012

Я немного новичок в триггерах в SQL Server (2008 R2) и столкнулся с небольшой проблемой. У меня есть следующая таблица (некоторые поля были опущены для краткости):

CREATE TABLE [dbo].[Task] (
    [TK_ID] [int] IDENTITY(1,1) NOT NULL,
    [TK_DateModified] [datetime] NULL,
    [TK_ModifiedBy] [int] NULL,
    [TK_DateCreated] [datetime] NULL,
    [TK_CreatedBy] [int] NULL,
    [TK_AssignedTo] [int] NULL)

Я добавил в таблицу 3 триггера:

Триггер 1 находится в процессе создания записи (вставки) и устанавливает дату создания и пользователя, который создал запись.

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

Триггер 3 находится на вставке / обновлении записи и настроен на отправку электронного письма пользователю, указанному в поле TK_AssignedTo.

Когда я пытался вставить запись, он отправлял пользователю несколько электронных писем. Я заканчиваю тем, что получил электронное письмо о создании и 2 электронных письма обновления. Я хочу, чтобы вставка попала в триггер 1 и триггер 3 из вставки, но я думаю, что обновление «созданных» полей в триггере 1 вызывает триггер 3 во второй раз, а поскольку триггер 1 вызывает обновление полей, он запускает триггер 2 , который делает еще одно обновление и запускает триггер 3 снова. Я попытался отключить рекурсивные триггеры в базе данных, чтобы этого не произошло, но я не думаю, что это дает желаемый эффект, и я попытался внести изменение в триггер 3, чтобы предотвратить отправку электронных писем, когда поля «создан» и «изменен» уволена. Вот кадр кода для триггера 3 на данный момент.

ALTER TRIGGER [dbo].[trig_Task_SendEmail] ON [dbo].[Task] FOR INSERT,UPDATE AS
IF (NOT UPDATE(TK_DateCreated)) AND (NOT UPDATE(TK_CreatedBy)) AND (NOT UPDATE(TK_DateModified)) AND (NOT UPDATE(TK_ModifiedBy))
BEGIN
  -- Coding to send email to user on changed tasks
END

В этой форме код для отправки электронного письма не запускается вообще, даже при вставке. Я думаю, что функция ОБНОВЛЕНИЕ (поле) не работает, как я надеялся, что будет. Есть ли способ отключить обновление этих 4 полей от запуска другого триггера обновления или какой-либо другой жизнеспособной опции, чтобы триггеры 1 и 3 срабатывали только при вставке, а триггеры 2 и 3 - при обновлении?

1 Ответ

1 голос
/ 07 февраля 2012

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

...
[TK_DateCreated] [datetime] DEFAULT GETDATE(),
[TK_CreatedBy] [int] DEFAULT SUSER_SID()
...

Я смоделировал два триггера (триггер UPDATE и триггер электронной почты):

CREATE TRIGGER [dbo].[tgUpdatedRecord]
ON [dbo].[Task] FOR UPDATE
AS
    BEGIN
        UPDATE t
        SET t.TK_DateModified = GETDATE(),
            t.TK_ModifiedBy = SUSER_SID()
        FROM [dbo].[Task] t
        JOIN [inserted] i
            ON t.[TK_ID] = i.[TK_ID]
    END
GO

... и ...

CREATE TRIGGER [dbo].[trig_Task_SendEmail]
ON [dbo].[Task] FOR INSERT, UPDATE
AS
    IF UPDATE(TK_AssignedTo) BEGIN
        PRINT 'Is this an email?'
    END
GO

Это похоже на то, что вы ожидаете.

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