是否可以在事务内(在SQL Server中)运行多个DDL语句?

Tou*_*uko 29 sql sql-server ddl transactions jtds

我想知道是否可以在事务中运行多个DDL语句.我对SQL Server特别感兴趣,尽管其他数据库(至少Oracle,PostgreSQL)的答案也很有趣.

我一直在为事务中创建的表做一些"CREATE TABLE"和"CREATE VIEW",似乎有些不一致,我想知道DDL是否不应该在事务中完成...

我可能会在事务之外移动DDL,但我想得到一些参考.我到目前为止所发现的:

对于Oracle:

如果它重要,我通过JTDS JDBC驱动程序使用Java.

br Touko

Dav*_*sel 13

我知道大多数数据库都有限制,但Postgres没有.您可以在事务中运行任何数字表创建,列更改和索引更改,并且其他用户单元COMMIT成功后看不到更改.这就是数据库应该如何!:-)

对于SQL Server,您可以在事务内部运行DDL,但SQL Server不会对版本元数据进行操作,因此在事务提交之前,其他人可以看到更改.但是如果你在一个事务中,一些DDL语句可以回滚,但是哪些是有效的,哪些不可用,你需要运行一些测试.

  • 两年后,只是回复我自己的一些后续行动......虽然SQL Server没有为DDL提供单独的事务,但它可以回滚多个DDL语句,这些语句是一个事务的一部分.我的同事刚刚对SQL Server 2008 R2进行了测试:"我尝试创建一个表,添加一个主键列,插入另一个表,将列添加到另一个表中,插入到该表中,然后强制出现一些无效的SQL错误正确回滚!" 只需确保每个DDL语句都在其自己的批处理中(使用GO分隔符). (2认同)

Stu*_*art 1

莫非在MS SQL中,运行DDL和DML语句时会触发隐式事务。如果您关闭此功能是否有帮助,请使用 SET IMPLICIT_TRANSACTIONS

编辑:另一种可能性 - 您不能将 CREATE VIEW 与同一批次中的其他语句结合起来。创建表就可以了。您可以使用 GO 分隔批次。

EDIT2:您可以在一个事务中使用多个DDL,只要用GO分隔即可创建不同的批次。