更新する必要があるいくつかのオブジェクトを含むテーブル(OBJECTS_TO_UPDATE
)があります。一部は、存在しないオブジェクトのSYNONYMs
です。
それらをリストするクエリを作成します。しかし、行き詰まっています。
テーブルOBJECTS_TO_UPDATE
には次の列があります:
OBJECT_NAME
OBJECT_TYPE
OWNER
言い換えれば、私がしたいことはこれらの線に沿っています:
OBJECTS_TO_UPDATE
テーブルをOBJECT_TYPE = 'SYNONYM'
でフィルタリングします。ALL_SYNONYMS
でSYNONYM
を取得できます。TABLE_OWNER
およびTABLE_NAME
を使用してdba_objectsで検索すると、オブジェクトが存在しない場合、シノニムは無効になります。これらすべての条件を使用してクエリを記述したいのですが、問題があります。
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)
NOT EXISTS
の内部で何をすべきかについて困惑/混乱しています。
どうすれば必要なことを達成できますか?私にはDBA特権があります。
また、これは私が望むものを達成するための最良の方法ですか?多分私はそれをもっと直接的に使うべきいくつかの他の見解があるでしょう。
ALL_OBJECTSのCOLUMNステータスの値が信頼できないようであるため、BriteSpongeによって提案されたオプションを使用できませんでした。ステータスがVALIDのSYNONYMを見つけることができましたが、それが指しているオブジェクトは存在しませんでした。
更新するオブジェクトのリストは、OBJECTS_TO_UPDATEテーブルです。次のクエリで、存在しなくなったオブジェクトを指しているOBJECTS_TO_UPDATEテーブルのすべてのシノニムを一覧表示できます。
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
))
ALL_OBJECTS
ビューに対してobject_type = 'SYNONYM'
およびstatus != 'VALID'
をクエリできます。ただし、all_objectsステータスは、参照しているオブジェクトのステータスに基づいて設定されます。基になるテーブルが消えても自動的に無効化されない同義語。したがって、ALL_OBJECTS
のSTATUS
列は、使用するのに信頼性がありません。
このクエリを使用してみてください:
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' ;