Oracle对DDL语句进行隐式提交。因此,您不必提交ALTER语句。
Microsoft SQL需要对DDL语句进行提交。
SQL-92太旧了,只有关于事务和最新SQL标准文档成本美元的基本信息,我拒绝支付应该免费的东西(imho)。
所以我希望有人知道标准是什么,如果标准没有澄清这一点,也许有一个事实上的标准或者设计建议"对于DBMS开发人员。
非常感谢。
修改:
为了澄清:我想知道的是,如果数据库应该对DDL语句进行隐式提交(根据标准或某种事实上的标准/建议)。我不想知道,实际的DBMS在实践中做了什么,因为我已经知道了(并且已经在SO上多次回答了这个问题。)
答案 0 :(得分:1)
感谢@GolezTrol提供的链接,我能够阅读SQL:2003标准的草稿。
在 4.33.4 SQL语句和事务状态中,它表示所有SQL Schema语句都是事务启动。
在 4.33.5 SQL语句的原子性和语句执行上下文中,它说,没有原子SQL语句(和SQL模式语句被认为是原子的)可以终止SQL事务。
最后,在 4.35.6 SQL-Transaction中语句的影响中,它说:
在SQL事务中执行SQL语句对SQL数据或模式没有影响,除了在SQL语句的一般规则中规定的效果之外,在子条款11.8的一般规则中,“引用约束定义”,在11.39的一般规则,“触发器定义”和第11.50条的一般规则中,“SQL调用的例程”
因此,似乎标准不允许DDL语句中的隐式提交,因为它将终止事务并在原子语句中打开新事务。可以说,如果关闭一个事务被认为是对SQL模式或数据的“影响”(4.35.6) - 也许这个注释与决定是否允许隐式提交无关。
在 4.35.1 SQL事务的一般描述中,它说:
它是实现定义的,是否允许在与执行SQL模式语句相同的SQL事务中执行SQL数据语句。如果确实发生,则对任何打开的游标或延迟约束的影响是实现定义的。可能存在其他实现定义的限制,要求和条件。如果违反任何此类限制,要求或条件,则会引发实现定义的异常条件或具有实现定义的子类代码的完成条件警告。
那么如果实现不允许一个事务中的数据和模式语句会发生什么呢?然后,您必须在模式语句的组之前和之后使用COMMIT。所以这不能解释为什么每个模式语句应该被COMMIT隐式包围。
一般来说,标准中的页面读起来总是将交易的SQL模式语句的存在视为理所当然。
所以我的结论是,标准方式是 NOT 在DDL语句中隐式COMMIT。
如果你不介意,如果对我对标准的解释没有异议/抗议,我会接受我在接下来几天内发现的内容。