代码之家  ›  专栏  ›  技术社区  ›  EvilTeach

如何使用Oracle在另一个模式中廉价地验证表中列的存在性?

  •  1
  • EvilTeach  · 技术社区  · 17 年前

    环境是Oracle 9&10我没有DBA级别的访问权限。

    问题在于验证另一个模式中的特定表中是否存在特定列。

    有两个案件需要处理。

    1. 同一实例中的另一个架构
    2. 不同实例中的架构,使用db_链接

    考虑到我的模式FRED和另一个模式BARNEY,我尝试了类似的东西

    SELECT 1
    FROM BARNEY.USER_TAB_COLS
    WHERE TABLE_NAME = 'SOME_TABLE' 
      AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
    

    产生 [1] :(错误):ORA-00942:表或视图不存在

    经过一段时间的研究,我意识到用户TAB并不是一张真正的桌子。这是一种观点。我一直在从表中选择,但不是从视图中选择。

    我在我的db_链接上尝试了同样的方法,并惊讶地看到数据回来了。db_链接中有一个嵌入的schema_名称/密码,因此在我看来,它可以正常工作,因为它可以有效地登录到另一个schema,从而可以访问视图。

    在谷歌上四处搜索,在神谕博士的山上磨坏了我的眼球, 我正在寻找一个人给我指出正确的方向,或者至少指出我所缺少的东西。

    有哪些技术可用于从同一实例中的模式获取与用户表相关的元数据,以验证特定列是否存在?

    提前谢谢。

    +一个好的答案。 非常感谢。

    4 回复  |  直到 15 年前
        1
  •  6
  •   Thorsten    17 年前

    您可以使用以下查询:

    SELECT 1
    FROM ALL_TAB_COLS
    WHERE TABLE_NAME = 'SOME_TABLE' 
      AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
      AND OWNER = 'BARNEY';
    

    (用户表和用户选项卡列只是带有 where owner = <Current User> (附于附件)

        2
  •  2
  •   Jim Hudson    17 年前

    和其他回复一样,我通常使用所有的\u TAB\u列来进行这样的查询。但这只会在您选择的表中显示列。这是该列上的select——在不太可能的情况下,他们为该表实现了列级权限,您可能可以看到该表,但看不到感兴趣的特定列。对我们大多数人来说,这是极为罕见的。

    DBA_选项卡_列将显示所有列,但您需要DBA授予模式的select。(实际上,要使用它,您需要在所有_TAB_列上获得授权,但这在大多数商店中很常见)。DBMS_元数据PL/SQL内置包也可以使用,具有类似的限制,但我认为您会发现它更复杂。

    当然,您也可以尝试从barney.some\u table.some中选择一条记录_column@my_dblink(或者你感兴趣的任何东西)。然后处理异常。丑陋,在大多数情况下我不推荐它。

        3
  •  1
  •   Robert Giesecke    17 年前

    您可以使用所有的选项卡列。

    但要小心,你只能看到你被允许看到的东西。

        4
  •  1
  •   David Aldridge    17 年前

    相同的实例,不同的架构:

    Select Count(*)
    From   all_tab_cols
    Where  owner       = 'BARNEY'               and
           table_name  = 'SOME_TABLE'           and
           column_name = 'SOME_SPECIFIC_COLUMN';
    

    count(*)的优点是总是返回值为1或0的单行,因此您不必处理 NO_DATA_FOUND PL/SQL中的错误。

    在数据库链接中,与您连接的模式相同,如下所示:

    Select Count(*)
    From   user_tab_cols@MY_DB_LINK
    Where  table_name  = 'SOME_TABLE'           and
           column_name = 'SOME_SPECIFIC_COLUMN';
    

    Select Count(*)
    From   all_tab_cols@MY_DB_LINK
    Where  owner       = 'BARNEY'               and
           table_name  = 'SOME_TABLE'           and
           column_name = 'SOME_SPECIFIC_COLUMN';
    
    推荐文章