2010-03-02 3 views
0

Я пытаюсь обновить базу данных оракула так, чтобы она соответствовала второй базе данных. При этом я что-то укусил. Я не могу создать или удалить какой-либо объект.Невозможно создать или удалить объекты 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 

я получаю ту же ошибку для любого создания или уронить я пытаюсь сделать. Есть идеи?

EDIT: запуск Oracle 10.2.0.4

+0

Вы пытаетесь создать или удалить объекты в своей собственной схеме или в чужом? Каков точный синтаксис, который вы используете при отмене процедуры выше? –

+0

Я вошел в систему как sysdba (я получаю ту же ошибку, если я вхожу в систему как eag), и я использовал этот точный синтаксис для создания процедуры. – climbage

+0

И вы получаете ошибку, затем с помощью 'DROP PROCEDURE EAG.TEST', если вы вошли в систему под именем' SYS as sysdba' или 'EAG'? –

ответ

2

У вас есть коррумпированный словарь данных.

Если вы можете создать новую базу данных и начать процесс синхронизации. На этот раз не использовать sysdba. Только sysdba имеет привилегии быть разрушительными для словаря данных.

Если вам нужны данные, но вы можете начать с них, вы все равно сможете экспортировать данные с помощью exp или expdp.

Если вы не можете начать работу с новой базой данных. Откройте SAR с поддержкой Oracle. Даже если кто-то еще сможет вас пропустить, это единственные, кто может вернуть вашу базу данных в состояние, поддерживаемое Oracle.

+0

Это похоже на повреждение базы данных. К счастью, это всего лишь тестовая база данных, поэтому никакого вреда не было. Теперь, если бы я мог просто понять, как я это испортил ... – climbage

+0

Просто для информации: эта ошибка также возникает, когда вы создаете представление, имеющее два столбца с одинаковыми именами кубов – andy

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 
+0

У меня было несколько собственных триггеров DDL, которые я отключено безрезультатно. – climbage

1

Потенциально это коррумпированные базы данных, но не быть слишком поспешным. Рекурсивные ошибки могут возникать при превышении пределов сеанса и процесса.

Есть небольшой шанс, что вы превысили лимит процессов. Сколько процессов вы имеете в своем примере? Вы близки к пределу, налагаемому параметром «процессы»? Если это так, рекурсивный SQL может быть неудачным и представить ошибку.

параметр Проверка процессов из Sqlplus сессии (или IDE) с:

show parameter processes 

Затем проверьте количество процессов от процесса об $:

select count(*) from v$process 

Вы близки к порогу? Если вы, увеличьте значение параметра процессов: например, если ваш предел процессов было 150 увеличение до 175

alter system set processes=175 scope=spfile 

Вы должны перезапустить сервер для изменения вступили в силу, как вы не можете динамически изменять параметры процессов.

В противном случае, проследить сессию и увидеть, где проблема на самом деле:

С текущего выпуска сессии следующее:

alter session set sql_trace=TRUE 

затем запустить create or replace again, когда это бомбы из взглянуть на ваш файл трассировки который создается в каталоге USER_DUMP_DEST.Ищите ошибки ORA там, они могут привести к другой проблеме, но это может сэкономить время.