Evi*_*ach 1 sql oracle database-link ora-00942
环境是Oracle 9和10.我没有DBA级别的访问权限.
问题是在另一个模式中验证特定表中是否存在特定列.
有两种情况需要处理.
鉴于我的模式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为好的答案.谢谢.
您可以使用以下查询:
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权限),那么您将知道该列是否存在.如果您对表没有任何权限,则无法获取有关它的元信息.