如何将行更新时间和行更新用户添加到表中?

时间:2017-05-09 20:48:11

标签: sql sql-server tsql sql-server-2016

我有一个包含创建日期的表,并创建了一个似乎正在运行的用户字段。

但是我很难创建一个功能正常的行更新日期时间和行更新字段。

我希望字段如何工作:当有人在表格中更新记录时,会记录日期/时间和用户名正在更新的记录。

这是我失败的触发器创建语法,我从Stack Overflow上看到的答案中错误地改编了:

我应该注意,我不明白插入的位置'表来自于许多其他例子。也不是为什么它和内部联合起作用。

CREATE TRIGGER mkt.Update_tbl_fTesting
  ON mkt.tbl_fTesting
  FOR UPDATE
AS

BEGIN
  SET NOCOUNT ON;

  UPDATE mkt.tbl_fTesting
    SET RowUpdateDateTime = GetDate()
      , RowUpdateBy = coalesce(SUSER_SNAME(), '?')
    FROM mkt.tbl_fTesting
    INNER JOIN inserted
    ON tbl_fTesting.tbl_fTestingIdentity = inserted.ID;
END
GO

执行触发器创建语法时出错:

  

无效的列名称' ID'

这是我的预期表创建语法:

USE [ObscuredDatabase]
GO

DROP TABLE [mkt].[tbl_fTesting]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [mkt].[tbl_fTesting](
    [tbl_TestingIdentity] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
  [Produce] [nvarchar] (25) NOT NULL,
  [Color] [nvarchar] (25) NOT NULL,
  [RowCreateDateTime] [datetime] NULL DEFAULT (getdate()),
  [RowCreateBy] [nvarchar](max) NULL DEFAULT (coalesce(suser_sname(),'?')),
  [RowUpdateDateTime] [datetime] NULL,
  [RowUpdateBy] [nvarchar](max) NULL
PRIMARY KEY CLUSTERED 
(
    [tbl_fTestingIdentity] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [SECONDARY]
) ON [SECONDARY]

GO

2 个答案:

答案 0 :(得分:8)

好吧,表的主键不是ID,而是tbl_TestingIdentity,所以在插入时你需要使用这个列名。 (inserted.tbl_TestingIdentity)

答案 1 :(得分:2)

  

我应该注意,我不明白插入的位置'桌来了   来自其他许多例子。也不是为什么它和内部联合起作用。

你真的很亲近。可以将inserted表视为一个临时表,其中包含将要插入或更新的记录。它与接收更新的表具有相同的结构。

所以您需要做的就是使用inserted表格中正确的列名称,该列表名称与mkt.tbl_fTesting中的JOIN列名称匹配:

CREATE TRIGGER mkt.Update_tbl_fTesting
  ON mkt.tbl_fTesting
  FOR UPDATE
AS

BEGIN
  SET NOCOUNT ON;

  UPDATE FTest
    SET RowUpdateDateTime = GetDate()
      , RowUpdateBy = coalesce(SUSER_SNAME(), '?')
    FROM mkt.tbl_fTesting FTest
    INNER JOIN inserted
    ON FTest.tbl_fTestingIdentity = inserted.tbl_fTestingIdentity;
END
GO

编辑更多信息:

想象一个简单的表格Clothes

ID | Type  | Color | RowUpdateDateTime
1  | Sock  | Pink  | NULL
2  | Sock  | Red   | NULL
3  | Shirt | Blue  | NULL

你运行一个简单的更新:

UPDATE Clothes
SET    Color = 'Green'
WHERE  Type = 'Sock'

在执行时,将创建一个inserted表,并将包含新行:

ID | Type  | Color | RowUpdateDateTime
1  | Sock  | Green | NULL
2  | Sock  | Green | NULL

然后,您的触发器将触发对RowUpdateDateTime列的更新:

UPDATE C
SET RowUpdateDateTime = GETDATE()
FROM Clothes C
INNER JOIN inserted i ON i.ID = C.ID;

由于联接谓词i.ID = C.ID只会更改受原始更新影响的行的修改日期

最终Clothes表:

ID | Type  | Color | RowUpdateDateTime
1  | Sock  | Green | 2017-05-09 16:32:09.873
2  | Sock  | Green | 2017-05-09 16:32:09.873
3  | Shirt | Blue  | NULL