我有一个名为Application的表,其中包含有关应用程序的信息。
AppID AppName AppGroup AppLocation TeamSize GrpSize
1 Nestle Food UK 6 12
2 RedBull Drink USA 5 15
3 Ford Vehicle USA 9 25
现在,当我更新此Application表中的任何行时,我想将值捕获到另一个名为AuditTable的表中。此外,我还需要将TeamSize和GroupSize的先前值捕获到该表中。
对于例如:当我更新第一行时,应该填充下面的审核表值,如下所示。
审核表:
但是Audit表没有OldTeamSize和OldGroupSize列。
AppID AppName AppGroup AppLocation OldTeamSize NewTeamSize OldGrpSize NewGrpSize
1 Nestle Food UK 6 3 12 8
我试图在asp.net c#中实现这个目标。真的很感激任何建议或想法。
答案 0 :(得分:0)
您可以通过两种方式完成此操作。您可以在更新或使用更新触发器之前先插入AuditTable。
示例1:插入然后更新
INSERT INTO dbo.AuditTable(Column1, Column2,...)
SELECT Column1, Column2, ... FROM dbo.Application WHERE (A filter you'll use when updating)
UPDATE dbo.Application
SET Column1 = NewColumn1Value,
Column2 = NewColumn2Value
WHERE (Your filter)
示例2:触发 // Google如何编写更新触发器
注意:最好提供您尝试过的代码段。
答案 1 :(得分:0)
目前还不清楚你使用的是哪个DBMS,但我肯定会考虑触发器。 对于MSSQL Server,您可以创建触发器,例如:
CREATE TRIGGER TriggerName
ON Table_Name
AFTER UPDATE
AS
BEGIN
...
..
END
在触发器主体内部,使用“inserted”数据集获取新值,并使用“deleted”获取旧值。例如,您可以使用以下命令将OldGrpSize存储到变量中:
declare @OldGrpSize int = (select OldGrpSize from deleted)
获得旧值和新值后,只需要一个INSERT语句将数据存储到Log表中。
当然,您可以使用.NET和C#,但我相信使用数据库触发器更容易实现。在这种情况下,如果你使用触发器它更安全,它更快(更少的客户端 - 服务器通信),并且它更容易维护。