是否有可能在一个事务中运行多个DDL语句(在SQL Server中)?

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

我已经做了一些“创build表”和“创build视图”的交易内创build的表,似乎有一些不一致,我想知道如果不应该在交易内完成DDL …

我大概可以将DDL移到事务之外,但是我想为此得到一些参考。 我发现了这么多:

  • MSDN页面数据库引擎中的隔离级别清楚地表明,在快照隔离下正在运行的显式事务中,可以执行哪些DDL操作是有限制的 – 但是我没有使用快照隔离,这应该导致错误。
    • 这可以被解释,以便DDL操作可以在不同隔离级别下的显式事务中执行。
  • 用于SQL Server的Oracle®数据库网关用户指南#DDL语句声明 在给定的事务中只能执行一个DDL语句 – 对于直接使用的SQL Server是否也有效?

对于Oracle:

  • 在SO问题中unit testingDDL语句需要在一个事务中 ,据说Oracle对DDL语句做了隐式提交? (即使没有参考)

如果有关系,我通过JTDS JDBC驱动程序来处理Java。

Touko

我知道大多数数据库都有限制,但是Postgres没有。 您可以在事务中运行任何数字表创build,列更改和索引更改,并且更改对其他用户单位COMMIT成功不可见。 这就是数据库应该是这样的! 🙂

至于SQL Server,你可以在一个事务中运行DDL,但是SQL Server没有版本元数据 ,所以在事务提交之前,其他人可以看到更改。 但是, 如果您处于事务中 , 某些DDL语句可以回滚 ,但是哪些DDL语句可以工作,哪些不需要运行某些testing。

如果你正在创build表,视图等(除了表variables或临时表),你可能真的需要重新考虑你的devise。 这不是通常应该从用户界面发生的东西。 即使您必须允许一些定制,DDL语句不应该与运行事务性插入/更新/删除同时发生。 分开这些function要好得多。

这也需要对两个用户同时更改同一个表的结构,然后运行一个事务来插入数据的情况进行审慎和testing。 当你允许用户调整你的数据库结构时,会发生一些真正可怕的事情。

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

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

也就是说,在一个交易中模式变更是如何相互作用的(如果完全相同的话),还有很大的余地。 这可以由供应商或甚至由我相信的特定安装(即,直到dba)。 所以至less不要用一个DBMS来假设别人会用DDL语句来说话。

编辑:MySql是一个不支持DDL交易的DBMS的例子。 此外,如果您有数据库复制/镜像,则必须非常小心复制服务(Sybase的复制是常态,不pipe是否相信)都将实际复制DDL语句。

难道是在MS SQL中,运行DDL语句和DML语句时会触发隐式事务。 如果closures此function,请使用SET IMPLICIT_TRANSACTIONS

编辑:另一种可能性 – 您不能将CREATE VIEW与同一批次中的其他语句组合在一起。 CREATE TABLE是可以的。 你用GO分开批次。

编辑2:只要用GO分隔,就可以在事务中使用多个DDL来创build不同的批次。