Требуется разрешение для использования 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 я не нашел никакой информации о реализации этой функции. Это детали реализации, так что это не проблема.
Единственное замечание, которое я нашел, это (для разных продуктов), например:
Эта функция соответствует функции ODBC SQLTables.
Таким образом, возможно, что драйвер ODBC вызывает хранимую процедуру sp_tables в своей реализации функции SQLTables для этого продукта, но никто этого явно не сказал (только то, что она соответствует).
Более того, для SAP Adaptive Server Enterprise такого примечания нет в процедуре sp_tables. Но вы можете попробовать. Или, что еще лучше, если у вас есть какой-то инструмент мониторинга команд, используйте его для отслеживания того, что ваш драйвер вызывает из своей реализации функции SQLTables.
В любом случае, это деталь реализации, о которой вам не следует беспокоиться или на которую можно положиться.