在特定表(产品)中更新任何字段时,复制元组或在另一个表(产品日志)中保存元组的ID

时间:2019-01-19 11:35:27

标签: sql-server database database-administration

我不知道找到的解决方案是否可行。

问题陈述::数据库中有一个名为产品的表,我需要跟踪价格已更新/修改的产品,但我不想使用modified_date列,因为它不存在。

一个高级资源要求我在SQL Server DB中运行查询,只要该表被修改,该记录就会被复制到您的log / track表中,因此我可以从那里找到。

2 个答案:

答案 0 :(得分:0)

尝试在UPDATE之后使用触发器:

    CREATE TRIGGER ModDate
    ON YourTable
    AFTER UPDATE
AS
BEGIN        
    INSERT INTO dbo.LogTable(DateModified)
    VALUES (GETDATE());
    PRINT 'New Block Date Added';
END 

更新:

当触发器起作用时,引擎盖下有两个表:

  • “已插入”
  • “已删除”

这些虚拟表中的数据取决于您正在执行的操作:

  • 插入操作:插入记录时,虚拟表“插入”包含新插入的记录,其中“已删除”虚拟表保持为空
  • 更新操作:更新记录时,首先,旧记录将被放入“ DELETED”虚拟表中,而新近更新的记录将被“ INSERTED”虚拟表保留。

    这意味着您可以从“ DELETED”中获取旧值,并可以通过“ INSERTED”虚拟表获取当前正在更新的值。您可以像这样查询它们:

    -- To get the old record value
    SELECT * FROM DELETED
    
    -- To get the updated value
    SELECT * FROM INSERTED
    
  • 删除操作:尝试删除任何特定记录时,已删除的记录将被插入“ DELETED”虚拟表中。

所以您的触发器应如下所示:

CREATE TRIGGER ModDate
    ON YourTable
    AFTER UPDATE
AS
BEGIN        
    INSERT INTO dbo.LogTable(DateModified, IdUpdatedRow)
    SELECT GETDATE(), INSERTED.YourIdOfUpdatedRow;
    PRINT 'New Block Date Added';
END 

答案 1 :(得分:0)

正如StepUp所提到的,执行此操作的经典方法是使用AFTER TRIGGER。示例解决方案将仅通过UPDATE触发。在您的情况下,您还想添加INSERT和DELETE的触发器,或者调整该触发器以处理这3种事件类型。

请注意,使用触发器会影响@@ ROWCOUNT,因此可能会影响功能。

因此,我认为SQL Server的最新版本具有替代机制。