我正在尝试更新oracle数据库,以便它的架构完全匹配第二个数据库。在这样做的时候,我已经有了一些东西。我无法创建或删除任何对象。
create or replace procedure eag.test
as
begin
null;
end;
错误:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
我尝试做的任何创建或删除都会出现同样的错误。有什么想法吗?
编辑:运行Oracle 10.2.0.4
答案 0 :(得分:2)
你有一个损坏的数据字典。
如果您可以构建新数据库并开始同步进程。这次不使用sysdba。只有sysdba才有权破坏数据字典。
如果您需要数据但可以重新开始,您仍然可以使用exp或expdp导出数据。
如果您无法重新开始使用新数据库。 在Oracle支持下打开SAR。即使其他人可能能够引导您完成此操作,他们也是唯一能够将您的数据库带回Oracle支持状态的人。
答案 1 :(得分:1)
值得检查数据库中是否有任何DDL触发器。 MDSYS中可能有一些内置的,但您可以拥有自己的(例如用于审核DDL)
select owner, trigger_type, triggering_event, trigger_name, base_object_type, when_clause, description
from dba_triggers d
where table_name is null
and status = 'ENABLED'
order by d.triggering_event, d.owner
答案 2 :(得分:1)
这可能是一个腐败的数据库,但不要太仓促。超出会话和进程限制时可能会发生递归错误。
您超出流程限制的可能性很小。您当前在实例中有多少个进程?您是否接近参数“过程”施加的限制?如果是这样,递归SQL可能会失败并显示错误。
使用以下命令检查sqlplus会话(或IDE)中的参数进程:
show parameter processes
然后检查v $ process的进程数:
select count(*) from v$process
你接近门槛了吗?如果是,请增加流程参数:例如,如果您的流程限制为150增加到175
alter system set processes=175 scope=spfile
您必须重新启动服务器才能使更改生效,因为您无法动态修改processes参数。
否则,跟踪会话并查看问题的实际位置:
从您当前的会话中发出以下内容:
alter session set sql_trace=TRUE
然后运行你的create or replace again
,当它轰炸时,查看在USER_DUMP_DEST目录中创建的跟踪文件。在那里寻找ORA错误,它们可能会导致不同的问题,但可能会节省大量时间。