0

我有 2 个表 Individual(IndividualId 是主键)和 IndividualAudit。每次对单个表记录进行更新时都会转到审计表。有很多列可以修改,但我只对修改 SSN 的记录感兴趣。我正在使用以下查询:

Select DI.IndividualId,DI.ssn FRom Individual I
INNER JOIN IndividualAudit  A
ON(I.IndividualId = A.IndividualId and A.UpdateDate = GETDATE())
where i.updatedate = GETDATE() and I.ssn <> a.ssn
group by I.IndividualId,I.ssn

有人可以告诉我我的方法是否正确。

实际上我在谷歌上搜索并害怕看到下面的链接: 使用审计表时查询帮助

在这篇文章中回答类似查询的人似乎对 sql 非常擅长,与他的回答相比,我的方法看起来很幼稚。所以我只想知道我的理解哪里错了。

非常感谢

4

1 回答 1

0

我建议不要修复查询,而是使用专门针对您关注的 SSN 列的更改的更新触发器。由于日期比较,您提供的查询将不起作用(正如 user2159471 所指出的那样)。但即使在您修复了查询之后,您仍然必须运行它才能查看哪些 SSN 已更新。

而是使用 SQL 更新触发器,该触发器可能会在个人的 SSN 每次更改时将条目插入到第三个表中。然后,您可以随时查看该表,或针对该表运行报告,以查看更改了谁。

触发代码如下所示:

CREATE TRIGGER MyCoolNewTrigger ON Individual 
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(SSN))
BEGIN
   Declare @oldSSN as varchar(40)
   Declare @NewSSN as varchar(40)
   set @oldSSN = deleted.SSN --holds the old SSN being changes
   Set @NewSSN = inserted.SSN -- holds the new SSN inserted
   Insert into IndividualUpdateLog (NewSSN, OldSSN, ChangeDate)
   values (@NewSSN, @oldSSN,  getdate)    
END
于 2013-07-19T14:39:22.427 回答