【问题标题】:Move data to historical table after delete删除后将数据移动到历史表
【发布时间】:2014-07-24 09:33:14
【问题描述】:

我想知道为某些表创建历史表并自动将已删除的行移动到具有相同列 + 已删除时间的新表的最佳方法。

例如: 当我从 PRODUCT 表中删除一行时,它将移至 PRODUCT_H 表并删除时间列。

感谢您的宝贵时间。

【问题讨论】:

  • 请分享一些您用于删除产品的代码。

标签: c# asp.net asp.net-mvc database entity-framework


【解决方案1】:

最好的选择是在数据库中设置类似的触发器:

    CREATE TRIGGER movetohistorical
        ON dbo.PRODUCT 
        FOR DELETE
    AS

    INSERT Product_H
    SELECT * FROM dbo.PRODUCT 
    WHERE PRODUCT.id IN(SELECT deleted.id FROM deleted)


GO

【讨论】:

  • 是的,这是最好的方法,但它仅适用于您想在 SQL Server 中执行操作的情况。如果您想在外部服务器(例如应用程序服务器)上记录此操作,这将不符合您的要求。
  • 即使您使用 EF 删除行,触发器也会触发
【解决方案2】:

最简单的方法是在数据库中实现触发器。

您可以使用CREATE TRIGGER 创建触发器。

您不必担心应用程序代码中的触发器。

触发器应该是AFTER DELETE触发器,只要一行(或几行)被删除,就会执行。

您可以阅读这篇文章,它几乎实现了您所需要的(它实现了一个历史表,但不记录当前日期时间):SQL Server: Coding the After Delete Trigger in SQL Server。事实上,你只需要做一点点改变。在示例中,历史表中的插入使用SELECT * FROM ...。要做你需要的,你只需要像这样添加GETDATE()函数:SELECT *, GETDATE() FROM ...。当然,目标表的末尾必须有这个日期列(如果出现问题,只需指定列名,而不是使用星号)。

任何其他选项都意味着向您的应用程序添加代码,并且需要在您的应用程序和 SQL Server 之间进行额外的通信。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多