我试图更好地了解 SQL Server 如何使用远程 SQL Server(例如链接服务器)上的统计信息。我了解用户需要 db_owner/db_ddladmin 权限才能使用远程框上的统计信息。起初,根据 Microsoft 的以下文本,这似乎非常简单。
要在链接服务器上使用表时创建最佳查询计划,查询处理器必须具有来自链接服务器的数据分布统计信息。对表的任何列具有有限权限的用户可能没有足够的权限来获取所有有用的统计信息,并且可能会收到效率较低的查询计划并体验较差的性能。如果链接服务器是 SQL Server 的实例,要获取所有可用的统计信息,用户必须拥有该表或者是链接服务器上 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员.
让我感到困惑的是“用户”这个词。我们对所有连接使用标准安全上下文,而不是用户登录。此登录名/用户具有上述对相关数据库定义的所需权限。此外,我们不使用模拟。
我尝试使用在删除服务器上具有和不具有提升权限的帐户在两端运行查询并捕获跟踪。在我看来,除非实际用户(键盘上的那个人)具有提升的权限,否则远程服务器不会收集统计信息。我相信这是真的,因为我只在用户拥有所需权限时才看到对 sys.sp_table_statistics2_rowset 的调用。
我真的希望这是有道理的。
有没有人了解这在 SQL 2008 R2 及更低版本中是如何工作的?
我所做的是这个“技巧”:
给这个 'linkuser' 读取,无论其他需要什么和
ddl_admin
权限,然后运行以下脚本以确保ddl_admin
实际上不能使用任何权限。但是,作为用户的技术成员,
ddl_admin
现在可以在远程数据库中查看统计信息!(注意:从 SQL2012SP1 开始,不需要这个 hack,统计数据应该是可见的)嗯,这真的取决于你如何设置链接服务器的安全上下文,对吧?如果坐在键盘前的人在远程服务器上没有任何权限,那么连接是如何建立的:它会切断它,它会使用当前的安全上下文,还是会在远程服务器上模拟特定的登录服务器?我认为这是你需要集中注意力的地方。在我们的 PROD 环境中,我们设置了一个具有读、写和 ddl 管理员权限的用户,并且所有连接都是使用该远程登录/密码的安全上下文进行的。我希望这有帮助。