2009-07-07 9 views
0

Ich benutze DBVisualizer, um DDL aus einer Oracle 10.2 DB zu extrahieren. Ich bekomme seltsame Instanzen von wiederholten Spalten in Constraints oder wiederholte Constraints in der generierten DDL. Zuerst habe ich es auf einen Fehler in DBVisualizer hingewiesen, aber ich habe versucht, Apache DDLUtils gegen die DB zu verwenden und es hat Fehler geworfen, die sich als durch dasselbe Problem verursacht ergaben. Die Tabellenmetadaten, die von Oracle zurückgegeben werden, scheinen für einige FK-Einschränkungen mehrere Einträge zu enthalten.Warum spuckt Orakel schlechte Tabellenmetadaten aus?

Ich kann keinen Verweis auf diese Art von Sache von meinen Google-Suchen finden und ich fragte mich, ob jemand anderes die gleiche Sache gesehen hatte. Ist dies ein Fehler im Oracle-Treiber oder enthalten die Metadaten zusätzliche Informationen, die gelöscht werden, wenn meine Tools darauf zugreifen, was zu Verwirrung seitens der Tools führt ...

Hier ist ein Beispiel (abgeschnitten) DDL Ausgabe von

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 
) 

ich bin versucht, ein Java-Beispiel zu finden, die das Verhalten zeigen kann und wird die Frage aktualisieren, wenn ich ein konkretes Beispiel haben.

Antwort

2

Sie können versuchen, die integrierte Oracle DBMS_METADATA.GET_DDL ('TABLE', 'ARTIST') und sehen, ob das das Problem behebt (dh ob es ein Fehler in den Tools oder der DB ist).

Sie können auch die data_dictionary Tabellen ansehen. In diesem Fall ALL_CONSTRAINTS und 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' 

Ich würde vermuten, dass es einen Fehler in den Tools ist, und sie haben eine Verknüpfung auf dem besitzenden Schema und Sie sind Abholung den gleichen Tisch/Zwang, sondern in einem anderen Benutzerschema verpasst.

+0

Ich habe auf diesem System nie in der Lage gewesen, alles andere als 31603 aus GET_DDL get() und bekommen Berechtigungen geändert hat, ist ein gigantischer Schmerz im Arsch, aber die select-Anweisung Werke scheint und Ihre Vermutung zu unterstützen . Ich denke, ich muss einen Fehler gegen DBVis und ddlutils einreichen. – Jherico

0

Soweit ich sehen kann, verwendet dbvis (6.5.7) eigenen Code, wenn Sie die Registerkarte "DDL" verwenden, und es verwendet dbms_metadata, wenn Sie die Registerkarte "DDL mit Storage" verwenden. Macht das für Sie einen Unterschied?

Ronald

+0

Wie ich oben erwähnt, die Kommentare, die GET_DDL() -Oracle-Funktion verwenden (was im Wesentlichen die Registerkarte "DDL mit Storage" ist) erzeugt einen Fehler für mich. – Jherico