2016-04-15 1 views
3

Voici la requête que je l'ai utilisé pour analyser des objets dba invalides de dba_objects dans la base de données et son retournaient avec des objets non valides:Différence entre Les synonymes Oracle

select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from dba_objects do 
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID' 
AND do.owner in ('AD','BD','DR','CD') 

est inférieure à la requête i ai utilisé pour analyser dba invalide objets de sys.dba_objects et son retour nulle:

select do.STATUS as CODE_STATUS, do.OBJECT_TYPE, do.OWNER, do.OBJECT_NAME from sys.dba_objects do 
WHERE UPPER(do.OBJECT_TYPE) IN ('TABLE', 'VIEW', 'FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') AND UPPER(do.STATUS) <> 'VALID' 
AND do.owner in ('AD','BD','DR','CD') 

Pourquoi la première requête renvoie des résultats avec le corps de package non valide et pourquoi la deuxième requête ne renvoie aucun résultat

+0

Le résultat est-il persistant? Je veux dire que vous exécutez cette requête les uns après les autres et le résultat est le même? Courez-vous cette requête sous le même utilisateur? – JSapkota

+0

Pouvez-vous dire ce que donne cette requête: select * from all_synonyms où synonym_name = 'DBA_OBJECTS' – Mottor

+0

@JSapkota le résultat est le même, c'est pourquoi je ne comprends pas la différence entre ce queires. – Andrew

Répondre

4

Les règles pour la résolution de noms are described in the documentation.

Lorsque vous exécutez votre requête sur sys.dba_objects, vous accédez directement à la vue appartenant à SYS et appelée dba_objects. Lorsque vous exécutez votre requête sur le non qualifiédba_objects alors vous pouvez accéder à une table ou une vue que vous possédez, ou un objet que vous ou quelqu'un d'autre possède, à travers un synonyme privé (que vous possédez) ou un synonyme public.

En général, il est juste un synonyme public pour les dba_* vues, ce qui signifie que si vous faites référence à dba_objects alors vous êtes toujours à la recherche en fait à sys.dba_objects, via ce défaut synonyme public.

Dans votre cas, deux utilisateurs ont des synonymes privés portant le même nom. Si vous êtes connecté en tant que READ_ONLY ou RM2_READ_ONLY, les synonymes privés de ces utilisateurs seront utilisés; Donc, quand vous faites référence à dba_objects, vous regarderez en fait o2support.rm_dba_objects, ce qui - en fonction des résultats que vous obtenez - est complètement sans rapport avec le contenu actuel de sys.dba_objects.

Pour résumer: vous avez un synonyme privé qui prévalent sur l'un public et les deux déclarations sont tables différentes requêtes.

Je suppose que c'est un instantané antérieur d'objets dans le système, probablement - du nom - d'objets qui allaient être supprimés, peut-être comme une référence pour les réintégrer si nécessaire. Quoi qu'il en soit, c'est vicié et vous ne semblez pas vouloir en voir le contenu.

Si vous voulez voir le dictionnaire de données actuel, vous devrez continuer à vous référer explicitement à sys.dba_objects, ou voir si les synonymes privés peuvent être supprimés en toute sécurité.

(Il est pas très utile, mais vous peut également se référer explicitement au synonyme public, mais le propriétaire doit être fourni comme identifiant cité, à savoir "PUBLIC".dba_objects à faire Il n'y a aucun avantage que plus se référant directement à sys.dba_objects bien. .)

+0

ohh ok maintenant j'ai compris et pourquoi quand j'interroge en utilisant sys.dba_objects c'est ne pas vérifier les objets de o2support.rm_dba_objects et ne pas retourner le résultats à droite? – Andrew

+0

@Amit - correct, il ne regardera que 'sys.dba_objects' ou .'o2support.rm_dba_objects', selon qu'il est qualifié ou utilise le synonyme, mais pas les deux. Dans votre question, vous avez l'inverse - 'sys' trouvé des données, non qualifié n'a pas; mais cela n'a pas d'importance, les résultats sont encore différents car vous accédez à différentes tables. –

+0

Parce que 'o2support.rm_dba_objects' a une entrée pour le paquet et l'affiche comme INVALID; mais 'sys.dba_objects' n'a pas d'entrée du tout, ou l'affiche comme VALID. Interrogez les deux tables/vues en utilisant le nom du package pour voir ce que chacune d'elles affiche. Je ne vois pas vos tableaux/vues, donc je ne sais pas ce qu'il y a dedans, et je ne sais pas pourquoi vous avez cette table/synonyme séparé, ou quand/pourquoi il a été peuplé. Vraisemblablement, c'était une copie du vrai 'sys.dba_objects' pris quand le paquet avait été invalidé, peut-être en changeant ou supprimant une dépendance, mais il n'y a aucun moyen pour moi de savoir ce qui s'est passé dans votre système. –