我有一个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);
谢谢 山姆
对于通用ODBC驱动程序,它是FireDAC调用的SQLTables函数。遗憾的是,对于SAP Adaptive Server Enterprise驱动程序,我没有找到有关此函数实现的任何信息。这是实现细节,所以不是问题。
我发现的唯一一个注释是(对于不同的产品),例如:
此函数对应于ODBC函数SQLTables。
因此,ODBC驱动程序可能会在其产品的sp_tables函数实现中调用SQLTables存储过程,但没有人明确表示(只有它对应)。
而且,对于SAP Adaptive Server Enterprise,其sp_tables过程没有这样的说明。但你可以尝试一下。或者更好的是,如果您有某种命令监视工具,请使用它来跟踪驱动程序从其SQLTables函数实现调用的内容。
在任何情况下,它都是您不应该关心或不依赖的实现细节。
问题不是权限,它是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目前没有任何其他信息。请使用“讨论”页面帮助我们记录此主题!
我们被迫猜测和/或尝试失败。