环境Oracle9&10.我没有DBA级别访问。

问题是要验证具体列存在的特定表格,在另一个模式。

有两种情况来处理。

  1. 另一种模式,在同样的实例
  2. 一个架构,在一个不同的实例,使用db_link

给我的架构弗雷德及另一个架构BARNEY,我试图像这样的东西

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

这产生了 [1]:(错误):ORA-00942:表或观点并不存在

后重返生机花园在这一段时间,我意识到,USER_TAB_COLS,是不是真的表格。这是一个景。我已经选择从表所有沿着的,但不是从一个图。

我尝试过同样的事情与我db_link,并且惊讶地看到数据回来。一db_link有一个嵌入式的架构名称和密码,使它似乎是合理的,我认它的工作,因为它有效地记录在其他架构,这应该使的意见可到达的。

有一派周围,穿破了我的眼球上在山上的Oracle医生, 我找人来点我在正确的方向,或者至少点什么我丢失。

什么样的技术可用于获取用户表相关的元数据架构,在相同的实例以证实这一具体列的存在?

在此先感谢。

邪恶。

+1良好的答案。谢谢你。

有帮助吗?

解决方案

与其他回复,通常我用ALL_TAB_COLUMNS查询这样。但是,这只会显示列在表中,有选择。和它的选择,列--在极少数情况下,他们已经实现柱级的权限,这表,你可以看到桌上,但看不到具体列的利益。对于我们大多数人来说,这是极其罕见的。

DBA_TAB_COLUMNS将显示所有列,但你会需要选择它给予你的架构,通过你的DBA。(实际上,你需要授予在ALL_TAB_COLUMNS使用它,但是这常见于大多数商店).该DBMS_METADATA PL/SQL内的包装也可以使用,与类似的局限性,但我认为你会找到它更加复杂。

当然,你也可以尝试中选择一个记录barney.some_table.some_column@my_dblink (或什么的碎片,你感兴趣的)。然后处理异常。丑,我不会建议它在大多数情况下。

其他提示

你可以用下面的查询:

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

(User_Tables和User_Tab_Cols只是意见all_tables和all_tab_coumns有 where owner = <Current User> 连接到它)

如果你允许看到巴尼的some_table(即你已经至少授予选择权限),然后你就会知道如果柱是存在的。如果你没有权在该表中,你将不能够获得meta的信息。

你会用all_tab_columns。

但当心,你只会看见什么你被允许看到的。

同样的实例,不同的模式:

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

该计数(*)具有的优点总是返回的一个单一的行一个价值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';
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top