1

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

[标签] 是两个表的主键

[ 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 ]有更新,则触发器需要更新 [table_2] 中的两列 [ LastUsedDate ]和 [ UsageCount ] 。[ table_1 ]的其他列中的任何更改都应在不影响 [ table_2 ] 的情况下进行处理。

我有一个触发器,当use_date在 [ table_1 ] 中更新时起作用......但如果不是,它会在其他列更新时导致提交问题。

这是提到的触发器

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

我知道我在那里遗漏了一些逻辑缺陷,但对于我的生活我看不到它......任何关于如何让这个工作的帮助将不胜感激。

提前致谢。

4

1 回答 1

1

需要注意两点:

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

  2. 如果您是从 NULL -> date 更新,则触发器不适合它。如果您从不使用 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
于 2013-04-04T09:26:58.323 回答