2010-03-02 3 views
0

J'essaie de mettre à jour une base de données Oracle pour que son schéma corresponde exactement à une deuxième base de données. Ce faisant, j'ai arrosé quelque chose. Je ne peux pas créer ou supprimer un objet.Impossible de créer ou de supprimer des objets Oracle

create or replace procedure eag.test 
as 
begin 
    null; 
end; 

Erreur:

ORA-00604: error occurred at recursive SQL level 1 
ORA-00942: table or view does not exist 

je reçois la même erreur pour tout créer ou de supprimer je tente de faire. Des idées?

EDIT: course Oracle 10.2.0.4

+0

Essayez-vous de créer/supprimer des objets dans votre propre schéma ou dans celui d'un autre? Quelle est la syntaxe exacte que vous utilisez en abandonnant la procédure ci-dessus? –

+0

Je suis connecté en tant que sysdba (j'obtiens la même erreur si je me connecte comme eag), et j'ai utilisé cette syntaxe exacte pour créer la procédure. – climbage

+0

Et vous obtenez l'erreur alors avec 'DROP PROCEDURE EAG.TEST' si vous êtes connecté en tant que' SYS as sysdba' ou 'EAG'? –

Répondre

2

Vous avez un dictionnaire de données corrompues.

Si vous pouvez créer une nouvelle base de données et démarrer le processus de synchronisation. Cette fois-ci n'utilisant pas sysdba. Seul sysdba a le privilège d'être destructeur pour le dictionnaire de données.

Si vous avez besoin des données mais que vous pouvez recommencer, vous pouvez toujours exporter les données en utilisant exp ou expdp.

Si vous ne pouvez pas recommencer avec une nouvelle base de données. Ouvrez un SAR avec le support d'Oracle. Même si quelqu'un d'autre est capable de vous guider à travers cela, ils sont les seuls à pouvoir ramener votre base de données dans un état pris en charge par Oracle.

+0

Il semble que la base de données est corrompue. Heureusement c'est juste une base de données de test donc pas de mal fait. Maintenant, si je pouvais juste comprendre comment je l'ai foiré ... – climbage

+0

Juste pour information: cette erreur se produit également lorsque vous créez une vue qui a deux colonnes avec des noms coumn identiques – andy

1

À vérifier si vous avez des déclencheurs DDL dans la base de données. Il y a probablement quelques construit dans ceux de MDSYS, mais vous pouvez avoir votre propre (par exemple pour l'audit 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

J'ai eu quelques déclencheurs DDL de mon propre que je désactivé en vain. – climbage

1

Potentiellement, cela est une base de données corrompue, mais ne soyez pas trop pressé. Des erreurs récursives peuvent se produire lorsque les limites de session et de processus sont dépassées.

Il y a une faible chance que vous ayez dépassé la limite de processus. Combien de processus avez-vous actuellement dans votre instance? Êtes-vous proche de la limite imposée par le paramètre "processus"? Si c'est le cas, SQL récursif pourrait échouer et présenter l'erreur.

Vérifier le paramètre processus de la session sqlplus (ou IDE) avec:

show parameter processes 

vérifier ensuite nombre de processus de v $ process:

select count(*) from v$process 

Êtes-vous proche du seuil? Si vous êtes, augmentez le paramètre des processus: par exemple si votre processus limite était de 150 augmentation de 175

alter system set processes=175 scope=spfile 

Vous devrez redémarrer le serveur pour que la modification prenne effet que vous ne pouvez pas modifier dynamiquement le paramètre processus.

Sinon, tracer la session et voir où le problème est en fait:

À partir de votre numéro actuel de la session qui suit:

alter session set sql_trace=TRUE 

Ensuite, exécutez votre create or replace again, quand il les bombes donnent à votre fichier de trace créé dans le répertoire USER_DUMP_DEST.Rechercher des erreurs ORA là-bas, ils peuvent conduire à un problème différent, mais cela peut économiser beaucoup de temps.

Questions connexes