テーブルがあります。それをMYTABLE
と呼びましょう。
SQLDeveloperでは、次のようにしてテーブル内のデータを確認できます。
SELECT * FROM MYTABLE
ただし、DESC MYTABLE
、それは私にエラーを与えます:
エラー:オブジェクトMYTABLEが存在しません。
Sqlplusから同じことを試してもエラーは発生せず、テーブルの列のリストが表示されます。
私はチェックした dba_all_tables
とテーブルの行があります。
select * from dba_all_tables where table_name = 'MYTABLE';
期待どおりに1行を返します。
何が欠けているかについてのアイデアはありますか?
コマンドは別のテーブル(MYSCHEMA.MYTABLE2
)、SQL開発者のバグではない可能性があります。
同じテーブルがいくつかのスキーマに存在します:
select owner, object_type, count(*) from dba_objects where object_name='MYTABLE' and owner='MYSCHEMA' group by owner, object_type;
MYSCHEMA TABLE SUBPARTITION 128
MYSCHEMA TABLE PARTITION 16
MYSCHEMA TABLE 1
残念ながら、これらのテーブルは作業中のスキーマに既に存在するため、これを個別に再現するための一連の手順を提供することはできません。現時点での私の推測では、テーブルの作成中にずっと前に問題が発生しており、会社のSCCSが変更されたために戻って実行されたソースコードを確認することはできません。
MYTABLE
は同義語またはmviewではありません。
このエラーは、2つのオブジェクトが同じ名前で作成された場合に発生することがあります。この問題は、バージョン17.4.1.054以降で発生します。
たとえば、テーブルとトリガーが同じ名前を共有している場合:
create table mytable(a number);
create or replace trigger mytable before insert on mytable for each row
begin
null;
end;
/
次に、コマンドdesc MYTABLE;
は次のエラーで失敗します:
ERROR:
------------------------------------
ERROR: object MYTABLE does not exist
オブジェクト名の1つを変更するか、テーブル名を二重引用符で囲むことにより、問題を回避できます。
desc "MYTABLE";
これは、MYTABLE
がシノニムのシノニムであるためである必要があります。SQLDeveloper 4.1.3ではサポートされていません(バグである必要があります)。 参考
User3、user2、user1という3人のユーザーがいます
SQL> conn user3/user3
Connected.
SQL> create table mytable(id number);
Table created.
SQL> grant select on mytable to user2 with grant option;
Grant succeeded.
SQL> conn user2/user2
Connected.
SQL> create synonym mytable for user3.mytable;
Synonym created.
SQL> grant select on mytable to user1;
Grant succeeded.
SQL> conn user1/user1
Connected.
SQL> create synonym mytable for user2.mytable;
Synonym created.
SQL> desc mytable;
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
SQL> conn / as sysdba
Connected.
SQL> select table_name from dba_all_tables where table_name='MYTABLE';
TABLE_NAME
------------------------------
MYTABLE
SQL> select owner from dba_tables where table_name='MYTABLE';
OWNER
------------------------------
USER3
それをSQL Developerで説明してみましょう。
desc mytable;
ERROR: object MYTABLE does not exist
サブパーティションのあるテーブルで同じ問題が発生しています。他のサブパーティションテーブルは問題ありません。 TOADでdescを正常に実行できます。
SQLDeveloperのEdge-caseバグのように見えます。
これは、テーブルにサブパーティションがあるためだと思います。発生したエラーはOracleエラーではありません(つまり、ORAエラーではありません)。これはツール固有のエラーのようです。