【发布时间】:2011-02-10 05:51:23
【问题描述】:
我正在尝试在应用程序正在运行且繁忙时向 Oracle 10 OLTP 数据库中的常用表添加可为空的列。添加可以为空的列只是数据字典的更改,因此任何表锁都只能保持很短的时间(可以由系统处理)。
问题是我的ALTER TABLE 经常失败:
ORA-00054: resource busy and acquire with NOWAIT specified
我目前的方法是通过运行它来阻止更改,直到表上碰巧没有锁为止。这意味着我无法在 SQL*Plus 中完整运行这样的脚本,但需要复制并粘贴每个语句并确保其正常工作。
有没有更好的办法?
【问题讨论】:
-
请记住,它会反编译依赖于表的任何内容(视图、包、触发器等),这在生产环境中可能不太好......
-
+1 表示 cagcowboy 的评论。不适合在 prod 环境中更改表的代码,可能会有很多无效的对象。这是一个需要协调的变更控制问题
-
11g 稍微改善了重新编译的情况,对依赖项进行了较低级别的跟踪。
-
某些对象在下次使用时会自动失效并重新编译。比关闭应用程序有一个短暂的暂停更好。没有大量的 PL/SQL,所以这不会花很长时间。应用程序处理 ORA-04068: 包的现有状态已被丢弃
标签: oracle alter-table ora-00054