查看和编译失效对象

news/2024/12/25 14:22:52/文章来源:https://www.cnblogs.com/xulinforDB/p/17493398.html

查看和编译失效对象

目录
  • 查看和编译失效对象
      • 1 背景:
      • 2 查看失效对象
      • 3 编译失效对象
      • 1: 使用ALTER *** COMPLIE语句手工进行编译,这个适用于少数、个别对象失效
      • 2:编译所有数据库下失效对象
      • 3:编译指定用户下的所有失效对象

1 背景:

在日常数据库维护过程中,我们会发现数据库中一些对象(包Package、存储过程Procedure、函数Function、视图View、同义词.....)会失效,呈现无效状态(INVALID)。有时候需要定期检查数据库中存在哪些失效对象,对于存在异常的对象需要重新编译,有些自动失效的对象,一般会在下次调用的时候,会被重新编译,所以这些不需要人工干预。那么为什么对象突然会失效呢?又如何快速、高效的编译失效对象呢?哪些失效的对象不需要我们去重新编译呢?

数据库对象失效原因

数据库对象失效的原因很多,下面大致归纳了一些常见的原因(有些漏掉的,希望大家补充):

1: 当被引用对象的结构变更时,都会使得相关的依赖对象转变为INVALID状态。

数据库中的对象(存储过程,函数,包,视图,触发器),它们往往需要直接或者间接的引用其它对象,对象的依赖包括直接和间接二种,其中直接依赖是指存储对象直接依赖于被引用对象,而间接依赖是指对象间接依赖于被引用对象

要查看被引用的对象,可以通过下面SQL查看

select * from dba_dependencies where name='&objectname';
select * from all_dependencies where name='&objectname';
select * from user_dependencies where name='&objectname';

举个简单例子,视图V_TEST引用了表TEST,TEST表修改了表结构时,会导致视图V_TEST变为无效对象。

SQL> CREATE TABLE TEST ( ID NUMBER(10));
Table created.SQL> CREATE VIEW V_TEST AS SELECT * FROM TEST;
View created.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST VALID--修改表结构,增加一个字段NAME后,视图V_TEST变为无效
SQL> ALTER TABLE TEST ADD NAME VARCHAR(12);
Table altered.SQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST INVALID--查询视图V_TEST后,数据库会重新编译视图
SQL> SELECT * FROM V_TEST;
no rows selectedSQL> SELECT OBJECT_NAME, STATUS FROM DBA_OBJECTS WHERE OBJECT_NAME='V_TEST';
OBJECT_NAME STATUS
------------------- ----------------
V_TEST VALID

其实不管视图,像存储过程,函数、包等,如果代码本身没有什么错误,只是引用的对象发生了变化。也会失效。但并不影响调用,因为ORACLE在调用时会自动重新编译的,如果其它对象变化后导致编译有错误。这时调用时重新编译后也是错误并处于失效状态,所以调用会出错。

2:发布SQL脚本时(包、存储过程、函数等),没有充分测试,编译时出错,这时对象变为无效。

3: 数据库升级、迁移时,出现大量无效对象(本质原因,个人臆测归结为原因1)。

4: 诸如此类各种情况:例如,Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建。

2 查看失效对象

统计失效的对象:


统计各个用户下失效对象的数目:
select owner, object_type, status, count(*)
from dba_objects
where status='INVALID'
group by owner, object_type, status
order by owner, object_type;1、检查无效的数据库对象:
SELECT owner, object_name, object_type,status 
FROM dba_objects 
WHERE status = 'INVALID'; 2、检查不起作用的约束:
SELECT owner, constraint_name, table_name, constraint_type, status
FROM dba_constraints
WHERE status = 'DISABLED';3、检查无效的触发器:
SELECT owner, trigger_name, table_name, status
FROM dba_triggers
WHERE status = 'DISABLED'; 4、检查失效的索引:
select index_name,table_name,tablespace_name,status
From dba_indexes 
Where status<>'VALID';

查看具体失效对象

col owner for a20;
col object_name for a32;
col object_type for a16
col status for a8
select owner, object_name, object_type, status
from dba_objects
where status='INVALID'
order by 1, 2,3;

下文大多参考博文Oracle中编译无效的对象常用方法,修改并作了总结、整理

3 编译失效对象

1: 使用ALTER *** COMPLIE语句手工进行编译,这个适用于少数、个别对象失效

alter package <schema name>.<package_name> compile;
alter package <schema name>.<package_name> compile body;
alter view <schema name>.<view_name> compile;
alter trigger <schema).<trigger_name> compile;如:
alter PACKAGE sys.DBMS_METADATA_UTIL compile;

2:编译所有数据库下失效对象

执行@$ORACLE_HOME/rdbms/admin/utlrp.sql脚本编译数据库失效对象。

许多情况下,由于数据库的升级或迁移,会导致数据库中的对象失效。由于对象之间可能存在复杂的依赖关系,所以手工编译通常无法顺利通过。通常我们会在Oracle的升级指导中看到这个脚本,Oracle强烈推荐在migration/upgrade/downgrade之后,通过运行此脚本编译失效对象。但是注意,Oracle提醒,此脚本需要用SQLPLUS以SYSDBA身份运行,并且当时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现(这是很容易理解的)。

Oracle highly recommends running this script towards the end of of any migration/upgrade/downgrade.

另外,utlrp.sql 里面其实调用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql来编译失效对象。

3:编译指定用户下的所有失效对象

ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译所有失效的过程、函数、触发器、包

exec dbms_utility.compile_schema( 'SCOTT' )

4: 一些网友书写的编译失效对象(经过整理)

SQL 1: 编译失效对象

set heading off; 
set feedback off; 
set echo off; 
Set lines 999; Spool run_invalid.sql select 
'ALTER ' || OBJECT_TYPE || ' ' || 
OWNER || '.' || OBJECT_NAME || ' COMPILE;' 
from 
dba_objects 
where 
status = 'INVALID' 
and 
object_type in ('PACKAGE','FUNCTION','PROCEDURE','TRIGGER','JAVA SOURCE','JAVA CLASS','') 
; 
spool off; 
set heading on; 
set feedback on; 
set echo on; @run_invalid.sql  

SQL 2:在上面的方法中,只能知道某某编译失败,不清楚失败原因,可以用PL/SQL实现更详细的错误信息

DECLARE v_objname        user_objects.object_name%TYPE; v_objtype        user_objects.object_type%TYPE; CURSOR cur IS SELECT object_name,object_type FROM USER_OBJECTS WHERE status = 'INVALID' AND object_type IN ('FUNCTION','JAVA SOURCE','JAVA CLASS','PROCEDURE','PACKAGE','TRIGGER'); 
BEGIN OPEN cur; LOOP FETCH cur into v_objname, v_objtype; EXIT WHEN cur%NOTFOUND; BEGIN EXECUTE Immediate 'alter ' || v_objtype || ' ' || v_objname||' Compile'; dbms_output.put_line('编译' || v_objtype || ' ' || v_objname || '()成功'); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('编译' || v_objtype ||' ' || v_objname || '()失败.' || SQLERRM); END; END LOOP; CLOSE cur; 
END; 

参考资料:

http://jzhil2004.blog.163.com/blog/static/275585042010117113214172/

http://blog.csdn.net/tianlesoftware/article/details/4843600

http://www.233.com/oracle/jishu/20071014/101911246.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【甲方安全】政府行业+80个威胁检测与安全事件分析场景(2025)

本篇幅详细梳理了 80 个在政企网络安全分析中常见的应用场景,这些场景涵盖了从攻击前兆(如漏洞扫描、情报收集)、攻击过程(如漏洞利用、横向移动)到攻击结果(如数据加密、信息泄露)的各个阶段,旨在协助 SOC 分析师们更好地构建主动防御体系。这些场景并非抽象概念,而是…

想自己做大模型备案的企业看过来【评估测试题+备案源文件】

大模型备案,大模型语料标注规则,大模型安全评估报告文章目录 (一)适用主体 (二)语料安全 (三)模型安全 (四)安全措施要求 (五)词库要求 (六)安全评估要求 (七)附录大模型备案材料源文件 2024年3月1日,我国通过了《生成式人工智能服务安全基本要求》(以下简称…

树洞09

情绪很不好,没人能依靠 钱财多有价,感情胜千金 金玉良缘广,木石前盟稀 愿君有真爱,伴君度此生。

qt读写ini文件

[group1]key1=val1key2=val2sameKay=sameVal [group2]jian1=zhi1jian2=zhi2sameKay=sameZhi比如创建插入一组ini文件,下面是文件写入的代码; Ini文件的写入 ini文件不需要像xml和json一样需要使用QFile打开文件,只需将文件路径及文件格式传入即可(下方代码运行完毕,ini文件…

【科普系列】LIN协议错误类型介绍

引言LIN(Local Interconnect Network)是一种针对汽车电子系统应用的串行通信协议,主要用于汽车电子控制单元(ECU)之间的通信。LIN总线的特点是成本低、速率低、通信距离短、连接节点少,主要用于对带块要求低、实时性要求不高的控制任务,例如车门控制、天窗控制、座椅控制…

详述大模型备案

大模型备案,大模型语料标注规则,大模型安全评估报告,大模型网信办备案大模型备案安全评估流程详细说明,见下图:大模型安全评估流程图 算法备案安全评估流程详细说明,见下图:算法安全评估流程图**大模型备案,大模型算法备案 ** 一、大模型算法备案的强制性 二、生成式人…

精选!J 人电商零售圣诞季,哪 6 款办公软件能激发团队工作学习潜能?

岁末的圣诞节,电商零售行业迎来了最为繁忙的购物狂欢季。在这关键时期,J 人电商团队凭借其果断、有计划、注重秩序的特质,渴望通过高效的团队协作和个人的快速学习成长,在激烈的市场竞争中脱颖而出。而选择合适的办公软件,无疑是实现这一目标的重要利器。接下来,将为您详…

智能网联汽车网络安全测试解决方案

经纬恒润的整车安全团队可协助客户制定系统的网络安全测试解决方案,具体包括:网络安全需求实现测试、网络安全合规性测试和渗透测试。经纬恒润可提供涵盖软件阶段、系统阶段和整车阶段的网络安全测试服务和相关测试工具,以实现网络安全策略的快速验证。概述为了应对日益严峻…

【工作相关】AOSP GSI image下载

android14 gsi下载地址: https://ci.android.com/builds/branches/aosp-android14-gsi/grid?legacy=1android13 gsi下载地址: https://ci.android.com/builds/branches/aosp-android13-gsi/grid?legacy=1

免费学习PostgreSQL,来这里看看PG从小白到专家技术公开课

PostgreSQL数据库是现在非常火的一种数据库技术,尤其是随着国内信创体系的建设,PostgreSQL由于其免费开源+功能强大等优点,在国内变得非常的热门,对于从事数据库相关职业的人员,学习下PostgreSQL技术非常有必要。 想免费学习PostgreSQL技术,可以观看CUUG数据库公开课有诸…

abb机械臂3HAC036260-001驱动器缺相维修

要判断ABB机器人3HAC036260-001驱动器是否存在缺相问题,可以通过以下几种方法:1、检查驱动器的状态指示灯:通常,驱动器会有状态指示灯来显示其工作状态。如果存在缺相问题,可能会有相应的指示灯亮起或闪烁,提示用户存在故障。2、使用专业的测试设备:例如,可以使用万用表…