C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как определить владельца таблицы?, Нужно знать не только имя,но и владельца
dvv
Отправлено: 03.11.2005, 21:11


Дежурный стрелочник

Группа: Участник
Сообщений: 43



В состав CBuilder и (Delphi) входит программа SQL-explorer. Как только она запускается, она показывает список ODBC — источников. Далее, когда я открываю некоторыый источник (базу данных), программа показывает мне список таблиц, которые содержит база данных.

Нужно сделать тоже самое.
Следующий код возвращает список таблиц базы:

CODE
TStrings *SL = new TStringList;
ADOConnection1->GetTableNames(SL, false);
ShowMessage(SL->Text);


Выдаеся список вида:
#temp
accounts
Akt
AmortList
AmortList
...
Однако, кроме имени таблица еще имет и владельца.
Мне приходится работать, в частности, с базой Sybase. Там при обращении к таблице владельца указывать обязательно:
SQL
Select * From dba.Akt


Подскажите как определить владельца таблицы?

Отредактировано dvv — 03/11/2005, 21:14
AVC
Отправлено: 04.11.2005, 09:09


Ветеран

Группа: Модератор
Сообщений: 1583



Как правило подробную информацию об объектах базы можно узнать просмотрев специальные служебные таблицы. Их названия и состав зависит от сервера и, возможно, от версии сервера. Описание этих таблиц можно найти в документации на сервер.

Так для Sybase ASA6 список таблиц и представлений хранится в SYS.SYSTABLE, список пользователей и групп в SYS.SYSUSERPERM, список процедур в SYS.SYSPROCEDURE
Пример
CODE

-- список таблиц пользователя DBA
Select
 T.table_id as CODE
,U.user_name as OWNER
,T.table_name as NAME
,T.count as ROWS
,'TABLE' as OBJECT
From
  SYS.SYSTABLE as T
 ,SYS.SYSUSERPERM as U
Where 1 = 1
 and T.table_type = 'BASE'
 and T.creator = U.user_id
 and U.user_name = 'DBA'
Order By
NAME
Gedeon
Отправлено: 04.11.2005, 09:09


Ветеран

Группа: Модератор
Сообщений: 1742



для asa
CODE

select
p.user_name,
t.table_name
from
SYS.SYSUSERPERM p,
SYS.SYSTABLE t
where
p.user_id = t.creator
AVC
Отправлено: 04.11.2005, 09:12


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

...Там при обращении к таблице владельца указывать обязательно

Нет, если таблица находится в схеме пользователя.
Gedeon
Отправлено: 04.11.2005, 10:47


Ветеран

Группа: Модератор
Сообщений: 1742



Как мы одновременно smile.gif
dvv
Отправлено: 04.11.2005, 12:35


Дежурный стрелочник

Группа: Участник
Сообщений: 43



QUOTE (AVC @ 04/11/2005, 09:09)
Как правило подробную информацию об объектах базы можно узнать просмотрев специальные служебные таблицы.

Вышеупомянутая программа SQL-explorer прекрасно распознает владельцев таблиц.
Возможно SQL-explorer и лазит по служебным таблицам.
Но прекрасно распознает владельцев на разных базах.
Мне нужно точно так же. Мне нужно на разных базах.
avc*
Отправлено: 04.11.2005, 13:28


Не зарегистрирован







Ну, для SQLExplorer можете посмотреть функцию DbiOpenTableList.
Очередной "универсальнй инструмент"?
dvv
Отправлено: 04.11.2005, 15:46


Дежурный стрелочник

Группа: Участник
Сообщений: 43



Не хочу показаться капризным, но мое приложение BDE не использует.
Пользуюсь ADO. А функция интерсная.

По поводу "универсального инструмента". В принципе — да.
Пользвовтель работает в окне, в котором набирает и отлаживает SQL-запрос. Хочется предложить User-у немножко сервиса. Ну что б он не вслепую писал запрос, а мог увидеть какие таблицы в базе, какие у таблиц поля, какого типа поля. Ну и содержимое таблиц посмотреть.
Так как предлагает SQLExplorer.
avc*
Отправлено: 04.11.2005, 16:16


Не зарегистрирован







Для ADO можно, наверное, посмотреть в его хелпах или на msdn.

QUOTE

Пользвовтель работает в окне, в котором набирает и отлаживает SQL-запрос. Хочется предложить User-у немножко сервиса. Ну что б он не вслепую писал запрос, а мог увидеть какие таблицы в базе, какие у таблиц поля, какого типа поля. Ну и содержимое таблиц посмотреть.

Имею некоторый опыт работы с разными БД. Для отладки запроса я воспользуюсь средствами, наиболее подходящими для данного сервера, так как зачастую просто таблиц и полей мало. Нужны связи, индексы, процедуры и функции ...
Но это мое личное мнение.
avc*
Отправлено: 04.11.2005, 16:24


Не зарегистрирован







Да, еще работа с планами оптимизации.
avc*
Отправлено: 04.11.2005, 17:16


Не зарегистрирован







Получение списка таблиц у ADO базируется на методе OpenSchema с параметром siTables, в результате получаем поля TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE. Подозреваю, что одно из них хранит информацию о владельце.

PS. До сих пор не приходилось смотреть хелп на OpenSchema, а там достаточно занимательная информация.

Вернуться в Работа с базами данных в C++Builder