如何创建表的回滚副本以防我插入或更新错误

Posted

技术标签:

【中文标题】如何创建表的回滚副本以防我插入或更新错误【英文标题】:how to create a rollback copy of a table just in case i do wrong insert or update 【发布时间】:2017-11-27 15:20:57 【问题描述】:

您好,我想知道是否有任何方法可以在 SQL Server 中创建表的回滚副本,以防我执行错误的插入或更新语句,我想恢复插入之前的数据或更新语句。

【问题讨论】:

为什么不把你的脚本放在一个带有回滚的事务中,直到你得到正确的脚本?确实没有必要为此创建整个表的副本。 我已将我的脚本放入事务中并且运行良好,但出于安全原因,我仍然需要我的表的副本。 回滚是您的安全网。如果您对创建表格副本一无所知,请查看 SELECT INTO。 实际上我需要它,因为它碰巧脚本运行良好,一切都是正确的,我也在使用事务,但是一旦我执行了查询,我就知道我更新了错误的记录所以这就是为什么我想要一个表的回滚副本。 所以你创建一个表,然后使用插入语句。或者,如果您想创建表格,可以使用 select into。 【参考方案1】:
SELECT * 
  INTO myBackupTableName
  FROM Yourtable

创建表的备份。

【讨论】:

【参考方案2】:

假设我们正在讨论生产环境和工作负载:我对这个问题/要求考虑得越多,我就越相信回滚是最好的答案。

总结已经提出的建议:

选择进入以创建备份表将创建表的副本,但如果您恢复到它,您可能会丢失其他用户或批次的数据。

使用 select 或 update 语句中的 into 子句将获得更改的行,但不会获得原始值。

另一个答案是创建一个审计表并使用触发器来填充它。您的审核表需要包含有关批次的足够详细信息,以识别它以进行回滚。这最终可能会成为一个相当大的兔子洞。一旦你在基表和审计表上有触发器,你就需要创建代码来使用这个审计表来恢复你的批处理。触发器可能会成为性能问题,如果数据库有足够多其他用户的足够更改,那么您仍然无法在不丢失其他用户工作的情况下恢复批处理。

您可以将更新和验证代码封装在同一个过程中,如果验证失败,则仅回滚您的更改。

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/begin-transaction-transact-sql

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/rollback-transaction-transact-sql

【讨论】:

以上是关于如何创建表的回滚副本以防我插入或更新错误的主要内容,如果未能解决你的问题,请参考以下文章

如何创建更新数据库日志表的 wcf 服务或 Web 服务?

openge sql 触发器的回滚和提交效果

如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?

在 Redshift 中更新整个表的正确方法,删除表 + 创建表与截断 + 插入表

Greenplum中删除的表的回滚数据

如何实现插入数据时自动更新另外一个表的内容