【问题标题】:Why is oracle spewing bad table metadata?为什么 oracle 会喷出错误的表元数据?
【发布时间】:2009-07-07 20:21:38
【问题描述】:

我正在使用 DBVisualizer 从 Oracle 10.2 数据库中提取 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 示例,并在我有具体示例时更新问题。

【问题讨论】:

    标签: oracle metadata ddl


    【解决方案1】:

    您可以尝试内置的 Oracle DBMS_METADATA.GET_DDL('TABLE','ARTIST') 看看是否可以解决问题(即是工具中的错误还是数据库中的错误)。

    您也可以查看 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'
    

    我怀疑这是工具中的一个错误,他们错过了对拥有架构的连接,而您正在选择相同的表/约束,但在另一个用户的架构中。

    【讨论】:

    • 除了 31603 之外,我从来没有从 GET_DDL() 中得到任何东西,并且在这个系统上更改权限是一个巨大的痛苦,但 select 语句有效并且似乎支持你的假设.我想我必须提交一个针对 DBVis 和 ddlutils 的错误。
    【解决方案2】:

    据我所知,dbvis (6.5.7) 在使用“DDL”选项卡时使用自己的代码,而在使用“DDL with Storage”选项卡时使用 dbms_metadata。 这对您有影响吗?

    Ronald

    【讨论】:

    • 正如我在上面提到的 cmets,使用 GET_DDL() oracle 函数(本质上是“带存储的 DDL”选项卡所做的)对我来说会产生错误。
    猜你喜欢
    • 2016-06-04
    • 2022-01-04
    • 2016-09-11
    • 2016-03-30
    • 1970-01-01
    • 2019-10-06
    • 2020-11-11
    • 1970-01-01
    相关资源
    最近更新 更多