模式修改命令是事务性的吗?

时间:2010-01-25 16:31:16

标签: sql-server transactions

例如,如果我删除一个表然后回滚事务是重新创建的表吗?

可以在事务中进行的架构更改有哪些限制?

如果以上内容取决于Sql Server的版本,请说明......

背景
我正在考虑使用一些“select into”语句来创建表,然后需要删除所有上述表作为工作流的后续部分。

这些表中没有几行会超过几十行。

3 个答案:

答案 0 :(得分:6)

大多数数据库对象DDL语句都可以是用户事务的一部分。存在一些例外,例如与数据库本身的文件相关的操作(如ALTER DATABASE ... ADD / REMOVE FILE)。再次在服务器级别,大多数对象可以是事务的一部分。例外情况是端点之类的对象,可能会启动或停止侦听套接字。

一般的经验法则是,如果是仅元数据操作,则它可以是事务的一部分。如果是具有外部副作用的操作(创建文件,打开套接字等),则它不能成为事务的一部分,因为无法保证回滚。

绝大多数DDL语句只是元数据,它们所做的只是修改一些元数据目录表(例如,它们在sys.tables中添加行),因此它们的行为与任何其他事务处理操作一样:如果事务是回滚该行被删除因此表'消失'。它有更多的细节(例如,sys.tables是一个真实内部表之上的视图,如sys.objects $,这是由CREATE TABLE修改的真实表),但是在高级别,这就是正在发生的事情。 / p>

答案 1 :(得分:3)

为什么不亲自测试你的场景?

我刚试了这个 - 花了2分钟。

USE [MY_DB]
GO
/****** Object:  Table [dbo].[TestTable]    Script Date: 01/25/2010 12:01:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TestTable](
    [testfield] [varchar](50) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

BEGIN TRAN

DROP TABLE TestTable 

ROLLBACK

答案 2 :(得分:-1)

线程坏死,似乎这不再是使用批处理时的情况,只需运行下面的代码,在ms sql server 2008 r2中,以下内容未被推回:

begin tran
go
create table AATableThatDoesNotExist
(
blah int null
)
go
create table AATableThatDoesNotExist
(
blah int null
)
go
create table AATableThatShouldNotExist
(
blah int null
)
rollback tran