0

DBVisualizer を使用して、Oracle 10.2 DB から DDL を抽出しています。制約で繰り返される列の奇妙なインスタンス、または生成された DDL で繰り返される制約を取得しています。最初は DBVisualizer のバグだと思っていましたが、DB に対して Apache DDLUtils を使用しようとしたところ、調査の結果、同じ問題が原因であることが判明したエラーがスローされ始めました。Oracle から返されるテーブル メタデータには、一部の FK 制約に対して複数のエントリがあるようです。

私のグーグル検索からこの種のものへの言及を見つけることができず、他の誰かが同じものを見たのではないかと思っていました. これは Oracle ドライバーのバグですか、それともツールがアクセスしたときにメタデータに追加情報が含まれているため、ツール側で混乱が生じているのでしょうか...

からの (切り捨てられた) DDL 出力の例を次に示します。

CREATE TABLE ARTIST
(
    ID INTEGER NOT NULL,
    FIRST_NAME VARCHAR2( 128 ),
    LAST_NAME VARCHAR2( 128 ),
    CONSTRAINT ARTIST_ID_PK PRIMARY KEY( ID ),
    CONSTRAINT ARTIST_CONTENT_ID_FK FOREIGN KEY( ID, ID, ID ) REFERENCES CMS_CONTENT( CONTENT_ID, CONTENT_ID, CONTENT_ID )
    -- note the multiple instances of ID and CONTENT_ID in the above line
    -- rest assured there is nothing bizarre about the foreign table CMS_CONTENT
)

動作を示すことができる Java の例を見つけようとしています。具体的な例があれば質問を更新します。

4

2 に答える 2

2

組み込みの Oracle DBMS_METADATA.GET_DDL('TABLE','ARTIST') を試して、問題が解決するかどうか (つまり、ツールまたは DB のバグかどうか) を確認できます。

data_dictionary テーブルも確認できます。この場合、ALL_CONSTRAINTS と ALL_CONS_COLUMNS です。

select ac.owner, ac.constraint_name, ac.table_name, ac.r_owner, ac.r_constraint_name,
       acc.column_name, acc.position
from all_constraints ac join all_cons_columns acc on
 (ac.owner = acc.owner and ac.constraint_name = acc.constraint_name)
where ac.table_name = 'ARTIST'
and ac.constraint_type = 'R'

ツールのバグであると思われます。所有しているスキーマへの結合を見逃しており、同じテーブル/制約を別のユーザーのスキーマで取得しています。

于 2009-07-07T22:55:27.747 に答える
0

私が見る限り、dbvis (6.5.7) は、[DDL] タブを使用する場合は独自のコードを使用し、[DDL with Storage] タブを使用する場合は dbms_metadata を使用します。これはあなたにとって違いがありますか?

ロナルド

于 2009-07-08T09:06:45.663 に答える