【问题标题】:SQL Server - Can DDL commands be rolled back? [duplicate]SQL Server - 可以回滚 DDL 命令吗? [复制]
【发布时间】:2021-04-03 20:28:15
【问题描述】:

我在堆栈溢出方面发现了类似的查询,但无法找到确切的答案。

当我在 SQL Server 2012 上使用 drop 和 truncate 等 DDL 命令时,我能够 回滚更改?理论上,我一直读到您可以回滚 DML 命令,但不能回滚 DDL,因为它们没有被记录。

我的问题是,是否也可以回滚 DDL 命令?或者这是导致它的 SSMS 中的某些特殊功能或设置更改。

Oracle 和 Postgres 等其他 SQL 平台呢?我们也可以在它们上回滚 DDL 命令吗?

【问题讨论】:

  • 查看微软官方文档怎么样?似乎是个好主意 - 这里是 TRUNCATE TABLE,并且有一个 注意:TRUNCATE TABLE 操作可以回滚。 - 很明显 - 是的,那些 DDL 命令可以 回滚根据需要返回

标签: sql sql-server ddl rollback


【解决方案1】:

DDL 回滚。

例子:

BEGIN TRANSACTION

CREATE TABLE a ( Id INT NOT NULL )

SELECT * FROM a -- returns an empty row

ROLLBACK TRANSACTION

SELECT * FROM a -- throws an error, object does not exist

出于这个确切原因,我总是在事务中包含我的 CREATE、ALTER、DROP 和 TRUNCATE。这样,如果有错误,我不会得到一些对象,但不会得到其他对象。测试您有疑问的 DDL。

【讨论】:

  • @user2611539 。 . .需要明确的是,此答​​案适用于 SQL Server。我赞成,因为这就是我解释你的问题的方式。问一个关于多个数据库的同一个问题(在我看来)对于一个问题来说太宽泛了,尤其是一个关于诸如事务管理之类的主题,该主题在不同数据库之间存在显着差异。
【解决方案2】:

你可以使用Begin TransactionBlock和Rollback - Commit如下图:

BEGIN TRANSACTION  
       INSERT INTO YourTable VALUES(1), (2);  
ROLLBACK TRANSACTION;  
  
INSERT INTO YourTable VALUES(3),(4);  
  
SELECT [value] FROM YourTable;  
  
DROP TABLE YourTable; 

COMMIT TRANSACTION;

如果你想做一些动作(DDL 命令或 DML 命令)你可以关闭Auto commit

首先,创建一个新的查询页面,然后,从menu itemsQuery\Query options

将 IMPLICIT_TRANSACTIONS 设置为 True

每当您完成工作时,您都可以通过commit \ rollback 命令或关闭页面和confirm\reject 交易来提交交易或回滚

但在那之后,如果您的事务应用于您的数据库和表, 您可以使用 Microsoft SQL recovery 工具回滚 drop tabletruncate table - EaseUS MS SQL Recovery

您将能够恢复被截断的表或在 DROP 后恢复表。 EaseUS MS SQL Recovery 是一款强大的工具,可以恢复已删除或损坏的 SQL 数据库数据。它可以在大多数情况下恢复已删除的 SQL 数据并修复损坏的数据库(MDFNDF 文件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多