如何通过Oracle廉价验证另一个模式中表中列的存在?

Evi*_*ach 1 sql oracle database-link ora-00942

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

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

有两种情况需要处理.

  1. 同一实例中的另一个模式
  2. 使用db_link在不同实例中的模式

鉴于我的模式FRED和另一个模式BARNEY,我试过这样的事情

SELECT 1
FROM BARNEY.USER_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
Run Code Online (Sandbox Code Playgroud)

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

在这一段时间过后,我意识到USER_TAB_COLS,实际上不是一个表.这是一种观点.我一直在从表中选择,但不是从视图中选择.

我用db_link尝试了同样的事情,并惊讶地看到数据回来了.db_link中有一个嵌入式schema_name /密码,所以我觉得它有用,因为它有效地登录到另一个模式,这应该使视图可以访问.

谷歌搜索了我的眼球,并在Oracle医生的山上磨了我的眼球,我正在寻找有人指出我正确的方向,或者至少指出我错过了什么.

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

提前致谢.

邪恶.

+1为好的答案.谢谢.

Tho*_*ten 6

您可以使用以下查询:

SELECT 1
FROM ALL_TAB_COLS
WHERE TABLE_NAME = 'SOME_TABLE' 
  AND COLUMN_NAME = 'SOME_SPECIFIC_COLUMN'
  AND OWNER = 'BARNEY';
Run Code Online (Sandbox Code Playgroud)

(User_Tables和User_Tab_Cols只是关于all_tables和all_tab_coumns的视图,where owner = <Current User>附加了它)

如果您被允许看到Barney的some_table(即您已被授予至少SELECT权限),那么您将知道该列是否存在.如果您对表没有任何权限,则无法获取有关它的元信息.