【问题标题】:tsql trigger which should only run if an update is made on specifc columnt sql 触发器,只有在对特定列进行更新时才会运行
【发布时间】:2013-04-04 09:12:54
【问题描述】:

基本上我在同一个 SQL 数据库中有两个表。 [table_1] & [table_2]

[Label] 是两个表的主键

[table_1]的设计是

 [Label] [varchar](50) NOT NULL
 [Use_Date] [date] NULL
 [Sent_Date] [date] NULL
 [Checked_Date] [date] NULL

[table_2]的设计是

 [Label] [varchar](50) NOT NULL
 [DateFirstRegistered] [date] NULL
 [LastUsedDate] [date] NULL
 [UsageCount] [int] NULL

如果 [table_1] 中的 [use_date] 有更新,则触发器需要更新 [LastUsedDate] 和 [表 2] 中的strong>UsageCount]。 [table_1] 的其他列中的任何更改都应在不影响 [table_2] 的情况下处理。

我有一个触发器可以在 [table_1] 中的 use_date 更新时工作...但如果不是,则在更新其他列时会导致提交问题.

这里是提到的触发器

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[trgOnTable1Update] ON [dbo].[Table_1]
AFTER UPDATE
AS
BEGIN

       UPDATE c
       SET           c.LastUsedDate=a.Use_Date,
                     c.UsageCount=c.UsageCount+1
       FROM   inserted a
                     INNER JOIN deleted b ON a.Label=b.Label
                     INNER JOIN [dbo].[Table_2] c ON a.Label=c.Label
                     WHERE  a.Use_Date<>b.Use_Date

END

我知道我在那里遗漏了一些逻辑缺陷,但我这辈子看不到它...... 任何有关如何使这项工作的帮助将不胜感激。

提前致谢。

【问题讨论】:

    标签: sql tsql triggers


    【解决方案1】:

    需要注意两点:

    1. 添加SET NOCOUNT ON 以防止从触发器中报告行数。您的客户端程序可能不期望第二个结果集,或者它可能正在解释第二个行数而不是实际的原始 UPDATE 语句,即它可能会看到“0 行受影响”并认为原始 UPDATE 失败。

    2. 如果您是从 NULL -> 日期更新,则触发器不适合它。如果您从不以 NULL 开头,这可能不是问题。


    CREATE TRIGGER [dbo].[trgOnTable1Update] ON [dbo].[Table_1]
    AFTER UPDATE
    AS
    BEGIN
           SET NOCOUNT ON;
           UPDATE c
              SET LastUsedDate=a.Use_Date,
                  UsageCount=c.UsageCount+1
             FROM inserted a
             JOIN deleted b ON a.Label=b.Label
             JOIN [dbo].[Table_2] c ON a.Label=c.Label
            WHERE a.Use_Date<>isnull(b.Use_Date,0)
    END
    

    【讨论】:

    • 谢谢。 set nocount on;* 是解决方案。不敢相信我错过了。
    • 在更新后的声明周围不应该有IF UPDATE(use_date) BEGIN ... END吗?
    • @RichardTheWiki,是的,我的回答是基于“如果该列包含在 UPDATE 语句中”。我认为这是问题所在,所以我删除了我的。我赞成你的意见,因为这是基于 OP 问题的正确答案。 FilipDeVos,不应该,这是我的答案,这不是 OP 需要的。
    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 2019-12-05
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多