Требуется разрешение для использования GetTableNames

У меня есть приложение-конструктор Delphi/C++, которое использует Firedac для подключения к базе данных Sybase ASE с использованием соединения ODBC. При подключении к базе данных, если я использую идентификатор / пароль пользователя системного администратора (SA) базы данных, все работает нормально и GetTableNames возвращается со списком таблиц в базе данных. Но если я использую обычный пользователь для подключения к базе данных, GetTableNames возвращается с пустым списком. У меня вопрос, какие разрешения я должен дать обычному пользователю, чтобы это работало.
И в качестве дополнительного вопроса, кто-нибудь знает, какую команду Firedac отправляет в базу данных, чтобы получить имена таблиц?
Мой код в Delphi выглядит так:

DBConnection.GetTableNames('', '', '', tableNameList, [TFDPhysObjectScope.osMy], [TFDPhysTableKind.tkTable]);

а в C++ Builder это выглядит так:

DBConnection->GetTableNames(L"", L"", L"", tableNameList, TFDPhysObjectScopes() << TFDPhysObjectScope::osMy, TFDPhysTableKinds() << TFDPhysTableKind::tkTable);

Спасибо
Сэм

2 ответа

Проблема была НЕ в разрешениях, это был 5-й параметр GetTableNames. Пятый параметр - это Scope, который определяет, какие таблицы будут возвращаться. osMy означает таблицы / объекты, принадлежащие зарегистрированному пользователю. Но обычно все таблицы в базе данных принадлежат SA/dbo, Добавление osOther к параметру исправит проблему. Таким образом, правильный способ вызова функции в Delphi:

DBConnection.GetTableNames('', '', '', tableNameList, [TFDPhysObjectScope.osMy, TFDPhysObjectScope.osOther], [TFDPhysTableKind.tkTable]);

и в C++ Builder это должно выглядеть так:

DBConnection->GetTableNames(L"", L"", L"", tableNameList, TFDPhysObjectScopes() << TFDPhysObjectScope::osMy << TFDPhysObjectScope::osOther, TFDPhysTableKinds() << TFDPhysTableKind::tkTable);

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

Я должен упомянуть, что я обвиняю Embarcadero в плохой документации TFDPhysObjectScope. Документация НЕ объясняет, что означает любое из этих значений. Слишком часто (как в этом случае) мы видим это:

Embarcadero Technologies в настоящее время не имеет никакой дополнительной информации. Пожалуйста, помогите нам задокументировать эту тему, используя страницу обсуждения!

И мы вынуждены угадывать и / или пытаться-неудачно.

Для универсальных драйверов ODBC это функция SQLTables, которую вызывает FireDAC. К сожалению, для драйвера SAP Adaptive Server Enterprise я не нашел никакой информации о реализации этой функции. Это детали реализации, так что это не проблема.

Единственное замечание, которое я нашел, это (для разных продуктов), например:

sp_tables

Эта функция соответствует функции ODBC SQLTables.

Таким образом, возможно, что драйвер ODBC вызывает хранимую процедуру sp_tables в своей реализации функции SQLTables для этого продукта, но никто этого явно не сказал (только то, что она соответствует).

Более того, для SAP Adaptive Server Enterprise такого примечания нет в процедуре sp_tables. Но вы можете попробовать. Или, что еще лучше, если у вас есть какой-то инструмент мониторинга команд, используйте его для отслеживания того, что ваш драйвер вызывает из своей реализации функции SQLTables.

В любом случае, это деталь реализации, о которой вам не следует беспокоиться или на которую можно положиться.

Другие вопросы по тегам