使用GetTableNames所需的权限

问题描述 投票:2回答: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);

谢谢 山姆

delphi c++builder sybase-ase firedac c++builder-10.2-tokyo
2个回答
1
投票

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

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

sp_tables

此函数对应于ODBC函数SQLTables。

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

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

在任何情况下,它都是您不应该关心或不依赖的实现细节。


1
投票

问题不是权限,它是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目前没有任何其他信息。请使用“讨论”页面帮助我们记录此主题!

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

© www.soinside.com 2019 - 2024. All rights reserved.