web-dev-qa-db-ja.com

オブジェクトテーブルに存在しないように見えるオブジェクトを見つけるにはどうすればよいですか?

cot_ntn_pi_vというオブジェクトがあります。これは同義語だと言われました。 all_synonymsテーブルには表示されません。ビューまたはテーブルのように見えますが、すべてのオブジェクトのテーブルにはありません。そこから選択することはできますが、「存在しない」ためドロップできず、「この名前はすでに別のオブジェクトで使用されています」と同じ名前で新しいテーブルを作成できません。

私は怒っていますか、それとも本当に愚かなことをしていますか?

11
BON

テーブルと同じ名前空間のオブジェクトタイプは次のとおりです。

  • スタンドアロンの手順
  • スタンドアロンのストアド関数
  • パッケージ
  • ユーザー定義型
  • シーケンス
  • ビュー
  • プライベートシノニム
  • マテリアライズドビュー

したがって、おそらくこれらのタイプの1つです。それから選択できる場合、最初の5つは除外され、テーブル、ビュー、プライベートシノニム、またはマテリアライズドビューのいずれかになります。

all_objectsなどで検索したとき、大文字を使用しましたか?例えば、

select *
  from ALL_OBJECTS
 where OBJECT_NAME = 'COT_NTN_PI_V'; 

SQL DeveloperやToadなどのツールを使用している場合は、ツールにオブジェクトの説明を任せることができます。ツールで名前を強調表示し、DeveloperではShift-F4、ToadではF4を押します。 Toadはオブジェクトに関する多くの説明を提供しますが、Developerの[Details]タブにはTABLE_NAMEまたはMVIEW_NAMEが含まれる行があり、それが何であるかを示します。

それが何であるかがわかったら、それをドロップする方法を簡単に知ることができます。

11
John Doyle

オブジェクト自体に対する権限がない場合、ALL_%テーブルでオブジェクトを表示できない可能性があるため、DBA_OBJECTSテーブルを確認します(これを行うには、権限/適切に権限が付与されたユーザーが必要です)。

select * 
from DBA_OBJECTS
where object_name = 'COT_NTN_PI_V';

それでも出力が生成されない場合は、次のクエリで生のOracleデータディクショナリテーブルをチェックインできます。

select u.name as owner, o.name as object_name, 
 decode(o.type#, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3, 'CLUSTER',
 4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',
 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
 11, 'PACKAGE BODY', 12, 'TRIGGER',
 13, 'TYPE', 14, 'TYPE BODY',
 19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
 22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',
 28, 'Java SOURCE', 29, 'Java CLASS', 30, 'Java RESOURCE',
 32, 'INDEXTYPE', 33, 'OPERATOR',
 34, 'TABLE SUBPARTITION', 35, 'INDEX SUBPARTITION',
 39, 'LOB PARTITION', 40, 'LOB SUBPARTITION',
 43, 'DIMENSION',
 44, 'CONTEXT', 47, 'RESOURCE PLAN',
 48, 'CONSUMER GROUP',
 51, 'SUBSCRIPTION', 52, 'LOCATION', 56, 'Java DATA', 'UNKNOWN') as type,
o.ctime, o.mtime,
 to_char(o.stime, 'YYYY-MM-DD:HH24:MI:SS'),
 decode(o.status, 0, 'N/A', 1, 'VALID', 'INVALID') as status
 from sys.obj$ o, sys.user$ u
 where o.owner# = u.user#
 and o.linkname is null
 and (o.type# not in (1 , 10) or
 (o.type# = 1 and 1 = (select 1
 from sys.ind$ i
 where i.obj# = o.obj#
 and i.type# in (1, 2, 3, 4, 6, 7, 9))))
 and o.name = 'COT_NTN_PI_V';
4
Philᵀᴹ