Sql 防止扳机开火

Sql 防止扳机开火,sql,sql-server,Sql,Sql Server,我有下面的触发器 第一个触发器: 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

我有下面的触发器

第一个触发器:

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
ALTER触发器[dbo]。[DIENSTLEISTUNG\u更新]
关于[dbo].[DIENSTLEISTUNG]
而不是更新
作为
开始
不计数;
声明@intNewID int
插入[DIENSTLEISTUNG]
(说明、数量、,
价格、价格、价格、价格、价格,
阿滋萨,阿滋苏,迪恩斯特莱斯东格萨特,
更新用户,更新日期,
权限、KONTRAKTPOSITION、ITEMNUMBER、,
优先权(有效)
选择i.说明、i.数量、i.价格、i.AZ_MO、,
i、 阿兹迪,我阿兹米,我阿兹多,我阿兹佛,
i、 AZ_SA,i.AZ_SO,i.SERVICETYPE_ID,i.UPDATE_USER,GETDATE(),
i、 权限,i.KONTRAKTPOSITION,i.ITEMNUMBER,i.PRIORITY,'Y'
从插入i
在i.ID=d.ID上加入已删除的d
我在哪里定价
或者我描述
IF(更新(价格)或更新(说明))
更新
设置s.VALID='N'
来自服务商
在i.ID=S.ID上连接插入的i
如果更新(优先级)
更新
设置s.PRIORITY=i.PRIORITY
来自服务商
在i.ID=s.ID上连接插入的i
不计数;
结束
如果原始行发生更改,第一个触发器将使用新ID复制整行,并且触发器将设置一个标志。旧行获取标志
VALID='N'
,新行获取标志
VALID='Y'
。只有更新了
PRICE
DESCRIPTION
时,触发器才会创建新行。到目前为止还不错

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


感谢您的帮助

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

您可以做的是在触发器内检查哪些列已更新。所以你可以在一个触发器中执行类似的操作:

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()
函数检查给定列是否已更新,如果已更新,请对其进行操作。请参阅。

您只能在某些列或一列上触发触发器。 像这样

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

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

一个触发器迅速变得复杂的极好例子。我会删除您的所有触发器,并将数据访问移到包含触发器功能的存储过程。我在sql中是新手,我没有存储过程方面的经验。也许你能帮我一下?存储过程比触发器容易。你可以找到很多好的我更新我的问题。到现在为止,它工作得很好!谢谢你的帮助!