例如,如果我删除一个表然后回滚事务是重新创建的表吗?
可以在事务中进行的架构更改有哪些限制?
如果以上内容取决于Sql Server的版本,请说明......
背景
我正在考虑使用一些“select into”语句来创建表,然后需要删除所有上述表作为工作流的后续部分。
这些表中没有几行会超过几十行。
答案 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