Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何为软删除设计单个备份表?_Sql Server_Database_Sql Server 2008_Soft Delete - Fatal编程技术网

Sql server 如何为软删除设计单个备份表?

Sql server 如何为软删除设计单个备份表?,sql-server,database,sql-server-2008,soft-delete,Sql Server,Database,Sql Server 2008,Soft Delete,我研究了如何在数据库中行的软删除和硬删除之间进行选择。我阅读了以下链接中给出的所有建议: 并得出结论,软删除是删除数据并同时保留数据的唯一方法,如果由于审计等原因,旧数据在未来变得重要,如果将表行移动到包含相同类型列和一些额外信息(如谁删除了行?或何时删除了行?)的备份表中,则可以更高效地执行恢复 我不知道我的产品的未来会是什么,我的客户现在没有要求,但将来可能需要旧数据。但要实现软删除的备份表方法,我必须为数据库中的每个表创建克隆表。但是有很多桌子,将来还会有更多的桌子。或者,如果

我研究了如何在数据库中行的软删除和硬删除之间进行选择。我阅读了以下链接中给出的所有建议:

并得出结论,软删除是删除数据并同时保留数据的唯一方法,如果由于审计等原因,旧数据在未来变得重要,如果将表行移动到包含相同类型列和一些额外信息(如
谁删除了行?
何时删除了行?
)的备份表中,则可以更高效地执行恢复

我不知道我的产品的未来会是什么,我的客户现在没有要求,但将来可能需要旧数据。但要实现软删除的备份表方法,我必须为数据库中的每个表创建克隆表。但是有很多桌子,将来还会有更多的桌子。或者,如果我更改一个表的设计(如更改数据类型或添加列),我也必须更改其备份表的设计

所以,我的问题是,有没有办法创建一个表,其中可以包含被删除的其他表的行?(比如一张
RecycleBin
表格或类似的东西)

我也愿意采用其他方法,通过性能来实现这一点

我正在使用SQL Server 2008和2012

更新

好的,我建议将你们建议的一切结合起来:

  • A
  • 审计表是存储删除元数据的审计表。示例:从
    A_Main
    中删除了谁、删除时使用ID外键的etc
  • 创建具有旧原始表名
    A
    的视图,以避免在所有查询和存储过程中进行修改。此视图将仅从
    A_Main
    中选择那些
    A_Audit
    不包含其
    ID
    的行
  • 现在将在此视图上执行操作

  • 这是一个好方法吗?

    将这个问题视为学术问题:

    所以,我的问题是,有没有办法创建一个表 是否可以包含已删除的其他表的行?(像一个 可回收利用表或类似的东西)


    仅当要存档的所有表都具有相同的列结构时。否则,您需要为要为其实现此软删除方法的每个表创建一个备份表。然后,当从原始表中删除行时,您可以在表上放置触发器以填充备份表,或者通过填充备份表并从原始表中删除的存储过程来控制删除操作。

    使用laravel,它具有免费内置的软删除功能。实际上,我正在将.NET与SQL Server一起使用。我不懂PHP编程。我认为,Laravel是一个PHP框架。我认为您只能在表中创建一个逻辑字段,如
    DELETED
    ,并从表中创建只返回not
    DELETED
    寄存器的视图。我不知道SQL Server是否有它,但像Oracle这样的数据库有一些功能,如分区表和物化视图,可以优化注册表访问。不幸的是,这是离题的,因为任何响应都将基于意见。这里没有正确或错误的答案。就我个人而言,我鄙视软删除,因为有太多的机会让一个查询出错,突然你看到“删除”的数据。我更希望有一个单独的表用于“删除”数据,这样它就不会影响当前数据。在一天结束时,你必须做出决定,让它在你的系统中工作。听起来你知道每个版本的陷阱。选择一个,然后去做。@JeanJung但为此,我需要在每个存储过程和查询中用表的视图替换表的所有引用。但它会有效率吗?我的意思是表中仍然有数据。请查看我的更新。我尝试了一种更简单的方法。但是不知道它是否有效。对不起,编辑(“这是一个好方法吗?”)只会让你的问题更加基于观点,脱离主题。如果有效,那就好了。如果它不工作,告诉我们为什么,也许我们可以帮助你调试它。我同意Tab Alleman的上述回答。审计表(基于触发器或“并行更新”)是捕获“主”表中所做更改的有用方法,我熟悉的商业数据库应用程序(4Series)使用了这种技术。如果主表有一个更新审计表的触发器,这将成为一个简单而优雅的解决方案。可以说,这个问题不再“过于宽泛”,因为使用触发器和审计表的答案可以用几段来表达。