【问题标题】:Oracle SQL - Could a DML statement ever cause an object to be invalid?Oracle SQL - DML 语句是否会导致对象无效?
【发布时间】:2011-06-23 06:56:25
【问题描述】:

我正在为我的公司编写一些批处理脚本,我在一些历史批处理脚本中看到了以下步骤:

  1. 有一个Delete from table where....声明
  2. Oracle 导入工具用于导入单条记录
  3. 重新编译架构

我认为您不需要在删除然后导入(插入)后重新编译架构。我错了吗?是否有可能 DDL 语句(如 delete 和 insert)可能会导致对象无效?

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    我假设您在导入时指定了 TABLES 参数?如果是这样,则您处于 TABLE 模式,这意味着不会导入程序对象、视图等。 imp 命令确实对进程可能导入的任何 PL/SQL 程序单元执行编译。可以想象,这可能会使其他依赖对象无效,因此批处理脚本中的重新编译步骤。当然,很多时候这种东西是根据另一个用作模板的脚本放入一个脚本中的,很容易就没有必要了。

    【讨论】:

    • 是的,tables 参数是用 where 子句定义的。从字面上看,删除一行然后重新添加它。 (它必须使用 IMPORT,因为该行包含一个 BLOB)。
    • 那么您应该不需要重新编译数据库对象。您当然可以通过省略重新编译步骤并在导入后检查无效对象来验证这一点。
    【解决方案2】:

    想不出为什么会发生这种情况,除非您的 DML 弄乱了数据字典,这听起来是个非常糟糕的主意...

    另一个想法是,重新编译可能会产生执行所需 COMMIT 的副作用?

    【讨论】:

    • 只有一个删除语句从非系统表中删除。另一个 DML 语句来自 Oracle 导入实用程序(我假设它执行插入)
    • 触发的可能性极小。可能和条件编译有关,但似乎很极端
    猜你喜欢
    • 2013-02-10
    • 2015-01-09
    • 2016-12-19
    • 2013-07-16
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多