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:
OBJECTS_TO_UPDATE
table par OBJECT_TYPE = 'SYNONYM'
.SYNONYM
dans ALL_SYNONYMS
.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.
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
))
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 STATUS
ALL_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' ;