2

我有一个 Delphi/C++ 构建器应用程序,它使用 Firedac 通过 ODBC 连接连接到 Sybase ASE 数据库。连接到数据库时,如果我使用数据库的系统管理员 (SA) 用户 ID/密码,一切正常,并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);

谢谢
山姆

4

2 回答 2

1

问题不是权限,而是GetTableNames的第 5 个参数。第 5 个参数是 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 目前没有任何其他信息。请使用讨论页面帮助我们记录这个主题!

我们被迫猜测和/或尝试失败。

于 2017-08-11T16:23:23.713 回答
1

对于通用 ODBC 驱动程序,FireDAC 调用的是SQLTables函数。不幸的是,对于 SAP Adaptive Server Enterprise 驱动程序,我没有找到任何有关此功能实现的信息。这是实现细节,所以这不是问题。

我发现的唯一注释是这个(针对不同的产品),例如:

sp_tables

此函数对应于 ODBC 函数 SQLTables。

因此,ODBC 驱动程序可能会在其SQLTables函数实现中为该产品调用sp_tables存储过程,但没有人明确表示(仅表示它对应)。

此外,对于 SAP Adaptive Server Enterprise,它的sp_tables过程没有这样的说明。但是你可以试一试。或者更好的是,如果您有某种命令监控工具,可以使用它来跟踪驱动程序从其SQLTables函数实现中调用的内容。

无论如何,这是一个您不应该关心或依赖的实现细节。

于 2017-07-27T18:55:58.180 回答