除了明显 - 为什么Oracle对象变得未编译

时间:2013-08-14 17:37:52

标签: database oracle database-design database-schema

除了明显之外 - 为什么Oracle对象变得无效/未编译。例如;我们执行DML / DDL更改的产品发布;我们验证Oracle Schema没有无效对象。我们不会更改任何对象以使对象变为未编译。我们在oracle 10.2.0.4.0;我们创建了一个每小时运行一次的脚本来编译无效对象。环境是托管的;所以我想知道为什么会这样。你的想法?

2 个答案:

答案 0 :(得分:1)

很难推测。许多错误来自对依赖项或权限的更改。要查看特定对象的问题,请使用以下查询:

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

<invalid object name><invalid object owner>(表示架构)必须为大写,除非使用双引号和非大写名称定义对象名称,例如CREATE TABLE "BadDecision" AS ...。< / p>

要查看所有无效对象的错误,请执行以下操作:

SELECT *
FROM All_Errors
WHERE (Owner, Name) IN (
  SELECT Owner, Object_Name
  FROM All_Objects
  WHERE status = 'INVALID')

答案 1 :(得分:1)

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

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

您不需要每小时重新编译对象的脚本。永远。但是,由于它是托管的,因此您的代码可能依赖于架构之外的对象。最值得注意的是System对象(DBMS_APPLICATION_INFO,DBMS_ALERT等),但这些对象很少会发生变化(通常是升级),因此可以安全地对其进行排除。如果您对该数据库中的另一个应用程序(架构)有依赖关系,那么这些对象可能会发生变化并导致您的依赖对象被标记为无效。

啰嗦,但希望有所帮助。