4

我有以下触发器

第一个触发器:

ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
INSTEAD OF UPDATE
AS

BEGIN
    SET  NOCOUNT ON;
    DECLARE @intNewID int

         INSERT INTO [DIENSTLEISTUNG] 
         (DESCRIPTION, QUANTITY, 
         PRICE, AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
         AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
         UPDATE_USER, UPDATE_DATE,
         PERMISSIONS, KONTRAKTPOSITION,ITEMNUMBER,
         PRIORITY, VALID)

         SELECT  i.DESCRIPTION, i.QUANTITY, i.PRICE, i.AZ_MO, 
         i.AZ_DI,i.AZ_MI,i.AZ_DO,i.AZ_FR,       
         i.AZ_SA,i.AZ_SO,i.SERVICETYPE_ID, i.UPDATE_USER,GETDATE(),
         i.PERMISSIONS, i.KONTRAKTPOSITION,i.ITEMNUMBER, i.PRIORITY, 'Y'

         FROM INSERTED i
         JOIN deleted d ON i.ID=d.ID
         WHERE i.PRICE<>d.PRICE
         or i.DESCRIPTION<>d.DESCRIPTION


         IF ( UPDATE (PRICE) OR UPDATE (DESCRIPTION) )
         UPDATE  S
         SET  s.VALID = 'N'    
         FROM SERVICE s
         JOIN INSERTED i ON I.ID = S.ID


         IF UPDATE(PRIORITY)
         UPDATE s
         SET s.PRIORITY= i.PRIORITY
         FROM SERVICE s
         JOIN INSERTED i ON i.ID = s.ID

   SET NOCOUNT OFF;      
END

如果原始行发生更改,则第一个触发器复制具有新 ID 的整行,触发器也会设置一个标志。旧行获得标志VALID = 'N',新行获得标志VALID = 'Y'PRICE触发器仅在更新或更新时创建新行DESCRIPTION。到目前为止,一切都很好。

我的问题是,如果我想更新PRIORITY新行中的 ,触发器会再次触发并将标志设置为VALID = 'N'. 那不应该发生。我只想更新优先级而不创建新行或更新另一列。

感谢帮助

4

3 回答 3

2

无法阻止触发器触发 - 如果它存在且未禁用,它将触发。这就是触发器的工作原理。

可以做的是在触发器内部检查哪些列已更新。所以你可以在你的一个触发器中做这样的事情:

CREATE TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
FOR UPDATE
AS
    IF UPDATE(PRICE) 
      ... (do what you need to do if PRICE is updated)...

    IF UPDATE(DESCRIPTION)
      ... (do what you need to do if DESCRIPTION is updated)...

    IF UPDATE(PRIORITY)
      ... (do what you need to do if PRIORITY is updated)...

使用该UPDATE()函数检查给定列是否已更新 - 如果是,则对其进行操作。有关如何使用该UPDATE()功能,请参阅MSDN 文档。

于 2012-07-31T09:56:09.197 回答
1

您可以使触发器仅在某些列或一个列上触发。像这样。

CREATE TRIGGER tr_something ON myTable
FOR INSERT, UPDATE
AS
IF UPDATE(myColumn)
BEGIN
--       do what you want
END

下面的帖子提供了更多细节,似乎我很慢:)

于 2012-07-31T09:59:02.273 回答
0

您可以做的是设置您所在会话的上下文信息,如下所示:

SET Context_Info 0x55555

然后在您的触发器中检查上下文信息以决定要做什么:

DECLARE @Cinfo VARBINARY(128)  
SELECT @Cinfo = Context_Info()  
IF @Cinfo = 0x55555  
    RETURN
于 2021-07-07T08:41:19.210 回答