1

除了显而易见的 - 为什么 Oracle 对象变得无效/未编译。例如; 我们执行具有 DML/DDL 更改的产品发布;我们验证 Oracle Schema 没有无效对象。我们不会更改任何对象以导致对象变为未编译。我们在 oracle 10.2.0.4.0;我们创建了一个每小时运行一次的脚本来编译无效对象。环境托管;所以我想充分了解为什么会这样。你的意见?

4

2 回答 2

2

DML 不会导致对象无效,但 DDL 会。当依赖项改变时,对象进入无效状态;视图、包、表格等。

例如,如果您向表中添加列,则任何依赖视图或代码(包或独立过程/函数)都将被标记为无效。如果从 SQL*Plus 运行(即直接连接),下次您运行其中一个时,视图或包将重新编译并返回到有效状态。棘手的地方是通过连接池通过 JDBC 或(可能)ODBC 连接时。使用这些方法,您通常需要创建全新的会话(或连接池)来解决问题。任何仍连接的会话(或连接池)仍会将这些对象视为无效并引发错误。

您不需要脚本来每小时重新编译对象。曾经。但是,由于这是托管的,因此您的代码可能依赖于架构之外的对象。最值得注意的是系统对象(DBMS_APPLICATION_INFO、DBMS_ALERT 等),但这些对象很少会改变(通常是升级),因此排除这种情况可能是安全的。如果您依赖于该数据库中的另一个应用程序(模式),则这些对象可能正在更改并导致您的依赖对象被标记为无效。

啰嗦,但希望对您有所帮助。

于 2013-08-15T03:28:23.013 回答
1

It's hard to speculate. A lot of errors come from changes to dependencies or permissions. To see the problem with a specific object, use this query:

SELECT *
FROM All_Errors
WHERE Name = '<invalid object name>'
  AND Owner = '<invalid object owner>'

The <invalid object name> and <invalid object owner> (meaning the schema) must be in uppercase unless the object name was defined using double-quotes and a non-uppercase name, for example CREATE TABLE "BadDecision" AS ....

To see errors for all invalid objects, do this:

SELECT *
FROM All_Errors
WHERE (Owner, Name) IN (
  SELECT Owner, Object_Name
  FROM All_Objects
  WHERE status = 'INVALID')
于 2013-08-14T17:54:24.257 回答