2009-10-29 2 views
1

Окружающая среда Oracle 9 & 10. У меня нет доступа к уровню DBA.Как дешево проверить наличие столбца в таблице в другой схеме с Oracle?

Проблема заключается в проверке того, что определенный столбец существует в конкретной таблице, в другой схеме.

Есть два случая, с которыми нужно иметь дело.

  1. Другая схема в том же экземпляре
  2. Схема в другом случае, используя db_link

Учитывая мою схему FRED и другая схема 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 doc, Я ищу кого-то, чтобы указать мне в правильном направлении или хотя бы указать, чего я не вижу.

Какие методы доступны для получения метаданных таблицы, связанных с таблицей, из схемы в одном экземпляре, чтобы проверить, существует ли определенный столбец?

Заранее благодарен.

Зло.

+1 для хороших ответов. Спасибо.

ответ

2

Как с другими ответов, обычно я использую ALL_TAB_COLUMNS для такого запроса. Но это будет показывать только столбцы в таблицах, где у вас есть SELECT. И он выбирается в этом столбце - в маловероятном случае, когда они реализовали привилегии на уровне столбца для этой таблицы, вы можете увидеть таблицу, но не видите интересующий столбец. Для большинства из нас это крайне редко.

DBA_TAB_COLUMNS покажет все столбцы, но вам понадобится выбрать его, предоставленный вашей схемой вашим администратором баз данных. (На самом деле вам понадобится грант на ALL_TAB_COLUMNS, чтобы использовать его, но это распространено в большинстве магазинов). Также можно использовать встроенный пакет DBMS_METADATA PL/SQL с аналогичными ограничениями, но я думаю, вы найдете его более сложным.

Конечно, вы также можете просто выбрать запись из [email protected]_dblink (или любых других частей, которые вас интересуют). Затем обработайте исключение. Ужасно, я бы не рекомендовал его в большинстве ситуаций.

1

Для этого вы должны использовать all_tab_columns.

Но будьте осторожны, вы увидите только то, что вам разрешено видеть.

6

Вы можете использовать следующий запрос:

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 в Барни (т. е. у вас были GRANTed, по крайней мере, на привилегии SELECT), тогда вы узнаете, есть ли столбец. Если у вас нет прав на стол, вы не сможете получить метаинформацию.

+0

Вы также можете запросить DBA_TAB_COLS. Если у вас есть доступ к этой таблице, вы можете увидеть информацию о других объектах, независимо от того, имеете ли вы возможность запрашивать данные в этой таблице. Это может быть полезно, если вы хотите разрешить учетной записи администратора проверять, есть ли столбец SALARY в таблице EMP без доступа к запросу данных в столбце. –

1

же экземпляр, другая схема:

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.

Через БД Link, так же схему, как один вы подключаетесь как:

Select Count(*) 
From [email protected]_DB_LINK 
Where table_name = 'SOME_TABLE'   and 
     column_name = 'SOME_SPECIFIC_COLUMN'; 

Через БД Link, различные схемы, чем тот, который вы подключить как:

Select Count(*) 
From [email protected]_DB_LINK 
Where owner  = 'BARNEY'    and 
     table_name = 'SOME_TABLE'   and 
     column_name = 'SOME_SPECIFIC_COLUMN'; 
Смежные вопросы