web-dev-qa-db-fra.com

Comment répertorier les synonymes qui ne pointe plus d'un objet valide?

J'ai une table (OBJECTS_TO_UPDATE) Avec plusieurs objets que j'ai besoin de mettre à jour, certains sont SYNONYMs pour des objets qui n'existent plus.

Je veux créer une requête pour les énumérer. Mais je suis coincé.

Ma table OBJECTS_TO_UPDATE a ces colonnes:

  • OBJECT_NAME
  • OBJECT_TYPE
  • OWNER

En mots ce que je veux faire va suivre ces lignes:

  • Je filtre mon OBJECTS_TO_UPDATE table par OBJECT_TYPE = 'SYNONYM'.
  • Utiliser le propriétaire et le nom, je peux obtenir le SYNONYM dans ALL_SYNONYMS.
  • En utilisant le TABLE_OWNER et TABLE_NAME et recherchez-la dans le DBA_Objects, si l'objet n'existe pas, le synonyme n'est plus valide.

Je veux écrire une requête en utilisant toutes ces conditions, mais j'ai des problèmes.

select *
from OBJECTS_TO_UPDATE o2u 
where o2u.OBJECT_TYPE = 'SYNONYM' and NOT EXISTS ( 
                            --select * from dba_objects dobj
                            --where dobj.OWNER
                            select * from ALL_SYNONYMS syn
                            where  syn.OWNER = o2u.OWNER and syn.SYNONYM_NAME = o2u.OBJECT_NAME)

Je suis coincé/confus sur ce qu'il faut faire à l'intérieur de l'NOT EXISTS.
[.____] Comment puis-je atteindre ce dont j'ai besoin? J'ai dba privé.

En outre, est-ce la meilleure façon de réaliser ce que je veux? Peut-être qu'il y a d'autres points de vue que je devrais utiliser cela plus direct.

4
Dzyann

Je ne pouvais pas utiliser l'option suggérée par Britsponge car la valeur de l'état de la colonne dans All_Objects ne semble pas fiable. Je pourrais trouver un synonyme qui avait été valide, mais l'objet qu'il indiquait n'avait pas existé.

La liste des objets que je veux mettre à jour est la table Objects_To_Update. Je pourrais répertorier tous les synonymes de la table Objects_To_update qui indiquait à un objet qui n'existait plus avec la requête suivante:

select *
from OBJECTS_TO_UPDATE o2u 
where o2u.OBJECT_TYPE = 'SYNONYM' and EXISTS ( 
                            select * from ALL_SYNONYMS syn
                            where  syn.OWNER = o2u.OWNER and syn.SYNONYM_NAME = O2U.OBJECT_NAME
                            and NOT EXISTS (
                            select * from dba_objects dobj
                            where dobj.OWNER = syn.TABLE_OWNER and dobj.OBJECT_TYPE != 'SYNONYM' and dobj.OBJECT_NAME = syn.TABLE_NAME
                            ))
1
Dzyann

Vous pouvez interroger le ALL_OBJECTS vue pour object_type = 'SYNONYM' et status != 'VALID'. Cependant, All_Objects Statut est défini sur la base de l'état de l'objet à laquelle elle se réfère. Synonymes, qui ne sont pas automatiquement invalidés si la table sous-jacente disparaît. Donc, la colonne STATUSALL_OBJECTS n'est pas fiable à utiliser.

Essayez d'utiliser cette requête:

SELECT obj.owner, obj.object_type, syn.synonym_name, tab.table_name
    FROM objects_to_update obj 
        INNER JOIN all_synonyms syn 
            ON obj.object_name = syn.synonym_name 
        INNER JOIN all_tables tab 
            ON  tab.table_name = syn.table_name 
            AND tab.owner = syn.table_owner 
    WHERE obj.object_type = 'SYNONYM' ;
1
BriteSponge