2016-04-04 3 views
1

Я пытаюсь отредактировать таблицу EditingField_Poly и столбец Send_Email от «Да» до «Нет». Это не позволяет мне сохранить редактирование ... Когда я отключу триггер, он позволяет мне сохранить. Этот триггер должен видеть, есть ли новая вставка или какая-либо обновленная информация для этих двух столбцов - если есть, то это изменит статус в столбце Send_Email с «Нет» на «Да»Триггер SQL Server для вставки или обновления

Может кто-нибудь помочь мне, что я не удалось с этим триггером?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Send_Email] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR UPDATE, INSERT 
AS 
    IF (UPDATE([Status]) or UPDATE([Department])) 
    BEGIN 
      SET NOCOUNT ON; 

      DECLARE @OID int; 
      SELECT @OID = i.OBJECTID from inserted i; 

      UPDATE [dbo].[EDITINGFIELD_POLY] 
      SET Send_Email = 'Yes' 
      WHERE OBJECTID = @OID    
END 
GO 
+0

Вы можете оставить структуру таблицы? – Philipp

+0

Вы _only_ устанавливаете поле 'Send_Email' или есть несколько полей, заданных в разделе' SET'? Если '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' \ ' –

+0

Что вы подразумеваете под словом «это не позволяет сохранить редактирование»? Получаете ли вы какие-либо ошибки или сообщения? – AKS

ответ

1

Ваш триггер сильно испорчено, поскольку он предполагает только одну строку в Inserted - это не всегда так. Если ваша операция или UPDATE влияет на несколько строк, триггер называется только один раз для всего оператора, а псевдо-таблицы будут содержать несколько строк!

Вам необходимо работать с этими знаниями и написать свой курок в полностью установленном моде - не используя код стиля SELECT @OID = Inserted.ObjectID!

Кроме того, поскольку вы проверяете в UPDATE случае является ли один из двух рядов изменилось, вы не можете легко сделать это в сочетании триггер - я бы рекомендовал использовать два отдельных триггеров, один для INSERT, один для UPDATE.

Попробуйте это:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[trg_Send_Email_Update] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR UPDATE 
AS 
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i 
    INNER JOIN Deleted d ON i.OBJECTID = d.OBJECTID 
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID 
     AND (d.Status <> i.Status OR d.Department <> i.Department) 
GO 

ALTER TRIGGER [dbo].[trg_Send_Email_Insert] 
ON [dbo].[EDITINGFIELD_POLY] 
FOR INSERT 
AS 
    UPDATE [dbo].[EDITINGFIELD_POLY] 
    SET Send_Email = 'Yes' 
    FROM Inserted i 
    WHERE [dbo].[EDITINGFIELD_POLY].OBJECTID = i.OBJECTID 
GO 
+0

Если мой OBJECTID - это ПК, то что произойдет? – Lanna

+0

@ Lanna: Я только что обновил свой ответ - просто небольшое изменение первого триггера. Должно работать просто отлично –

+0

Я сделал это и нет «END», и он дал мне эту ошибку: Msg 209, Level 16, State 1, Procedure trg_Send_Email_Update , Строка 10 Неоднозначное название столбца «OBJECTID». – Lanna

Смежные вопросы