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

时间:2009-06-25 12:16:58

标签: sql sql-server transactions ddl jtds

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

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

我可能会将DDL移到事务之外但是 我想得到一些参考。我到目前为止所发现的:

对于Oracle:

如果重要的话,我是通过JTDS JDBC驱动程序用Java做的。

b.r。 Touko

4 个答案:

答案 0 :(得分:13)

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

对于SQL Server,您可以在事务中运行DDL,但SQL Server does not version metadata,因此在事务提交之前,其他人可以看到更改。但是some DDL statements can be rolled back if you are in a transaction,但是哪些有效,哪些无效,你需要进行一些测试。

答案 1 :(得分:4)

如果要动态创建表,视图等(除了表变量或临时表),您可能真的需要重新考虑您的设计。这不是通常应该从用户界面发生的事情。即使您必须允许某些自定义,DDL语句也不应与运行事务插入/更新/删除同时发生。分离这些功能要好得多。

当需要对两个用户同时尝试更改同一个表的结构然后运行事务以插入数据时会发生什么情况需要考虑和测试这一点。当您允许用户调整数据库结构时,可能会发生一些非常可怕的事情。

此外,一些DDL语句必须始终是批处理的第一个语句。当你运行它们时也要注意它。

答案 2 :(得分:1)

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

编辑:另一种可能性   - 您无法将CREATE VIEW与同一批次中的其他语句组合在一起。 CREATE TABLE没问题。 您将批次与GO分开。

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

答案 3 :(得分:1)

对于一般情况和IIRC,假设DDL语句是事务性的是不安全的。

也就是说,关于模式更改如何在事务中进行交互(假设它完全没有),存在很大的余地。这可以是供应商,甚至是特定的安装(即直到dba),我相信。所以至少,不要使用一个DBMS来假设其他人会对DDL语句进行处理。

编辑:MySql是DBMS的一个示例,它根本不支持DDL事务。此外,如果您有数据库复制/镜像,则必须非常小心复制服务(Sybase的复制是常态,信不信由你)将实际复制DDL语句。