web-dev-qa-db-ja.com

有効なオブジェクトを指さなくなった類義語をリストする方法は?

更新する必要があるいくつかのオブジェクトを含むテーブル(OBJECTS_TO_UPDATE)があります。一部は、存在しないオブジェクトのSYNONYMsです。

それらをリストするクエリを作成します。しかし、行き詰まっています。

テーブルOBJECTS_TO_UPDATEには次の列があります:

  • OBJECT_NAME
  • OBJECT_TYPE
  • OWNER

言い換えれば、私がしたいことはこれらの線に沿っています:

  • OBJECTS_TO_UPDATEテーブルをOBJECT_TYPE = 'SYNONYM'でフィルタリングします。
  • 所有者と名前を使用すると、ALL_SYNONYMSSYNONYMを取得できます。
  • 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特権があります。

また、これは私が望むものを達成するための最良の方法ですか?多分私はそれをもっと直接的に使うべきいくつかの他の見解があるでしょう。

4
Dzyann

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
                            ))
1
Dzyann

ALL_OBJECTSビューに対してobject_type = 'SYNONYM'およびstatus != 'VALID'をクエリできます。ただし、all_objectsステータスは、参照しているオブジェクトのステータスに基づいて設定されます。基になるテーブルが消えても自動的に無効化されない同義語。したがって、ALL_OBJECTSSTATUS列は、使用するのに信頼性がありません。

このクエリを使用してみてください:

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