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

Copy Tuple OR save Id of Tuple in another table (ProductLogs) when any field is updated in a specific table (products)

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

问题陈述:数据库中有一个名为Products的table,我需要跟踪有价格的产品updated/modified,但我不想使用 modified_date 列,因为它不存在。

一位高级资源要求我 运行 在 SQL 服务器数据库中进行查询,每当 table 将被修改时,该记录将被复制到您的 log/track table,所以我可以从那里找到。

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

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

更新:

当触发器工作时,引擎盖下有两个 tables:

  • "INSERTED"
  • "DELETED"

这些虚拟 table 中的数据取决于您在做什么:

  • 插入操作:插入记录时,virtual table "inserted" 包含新插入的记录,其中 "DELETED" virtual table 保持为空
  • 更新操作:更新一条记录时,首先会将旧记录放入"DELETED"虚拟table,新更新的记录由"INSERTED"虚拟table.

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

    -- To get the old record value
    SELECT * FROM DELETED
    
    -- To get the updated value
    SELECT * FROM INSERTED
    
  • 删除操作:当尝试删除任何特定记录时,删除的记录将被插入到 "DELETED" 虚拟 table.

所以你的触发器应该是这样的:

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 

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

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

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