2009-06-25 32 views
28

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

我一直在做一些“创建表”和“创建视图”的交易内创建的表,并且似乎有一些不一致,我想知道如果不应该在事务内完成DDLs。 ..

我可能会移动DDL以外的交易,但 我想获得一些参考。我有这个迄今为止发现:

对于Oracle:

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

b.r. Touko

回答

1

难道是在MS SQL中,运行DDL和DML语句时会触发隐式事务。如果选中这一关这是否帮助,使用 SET IMPLICIT_TRANSACTIONS

编辑:另一种可能性 - 不能合并创建在同一批次的其他报表查看。 CREATE TABLE是可以的。 用GO分隔批次。

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

+0

我正在使用JDBC连接#setAutoCommit(false)并且DML语句没有使用隐式事务完成。 结果似乎更像是创建视图的表并不总是存在或某物。 – Touko 2009-06-25 12:42:51

+0

对于编辑:这可能是,但我想一些参考SQL Server文档或东西,无论是或不允许.. – Touko 2009-06-25 12:55:36

+0

我用这本书,看看你是否找到网上? Microsoft®SQLServer®2008 T-SQL基础知识 打印ISBN-10:0-7356-2601-4 打印ISBN-13:978-0-7356-2601-0 – Stuart 2009-06-25 12:59:05

1

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

也就是说,在事务内部架构变更如何相互作用(假设它完成)方面存在很大的余地。这可以由供应商或甚至通过我相信的特定安装(即,直到dba)。因此,至少,不要使用一个DBMS来假设其他人会用DDL语句来说话。

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

4

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

这也是一些需要考虑和测试的问题,当两个用户试图同时更改同一个表的结构,然后运行事务插入数据时会发生什么情况。当您允许用户对数据库结构进行调整时,会发生一些真正可怕的事情。

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

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,但哪些工作,哪些不需要运行一些测试。

相关问题