我做了什么:
ServerA
最近,我测试了在运行 SQL Server 2016 (SP 2 CU17) 标准版到 SQL Server 2019 标准版的开发服务器上进行就地升级。(我知道这不是进行升级的首选方式,而只是在开发服务器上进行测试,所以没有伤害没有犯规。)
在安装向导期间,其中一个步骤挂了很长时间,所以我的同事单击下一步按钮跳过该步骤。我不太记得它是哪一步,但我相信它是产品更新或安装设置文件步骤。我记得它接下来说它跳过了几种不同类型的下载。其余的安装顺利,成功完成。
我能够启动实例、登录并访问我们的数据库。然后我将数据库兼容级别提高到 150(SQL Server 2019 的兼容级别)。我运行了一些性能测试查询,然后最终决定打开 Legacy Cardinality Estimator。到目前为止,一切似乎都在工作。
发生的事情是:
然后我注意到了一些有趣的东西ServerB
,另一台已经在运行 SQL Server 2019 的开发服务器,并且有一个链接服务器设置指向ServerA
. 一切都运行良好ServerB
,除了引用链接服务器上的视图的任何查询,该视图在ServerA
其中使用了模式绑定标量函数。我收到错误The EXECUTE permission was denied on the object 'MyFunction', database 'Database1OnServerA', schema 'dbo'
。如果我返回ServerA
并更改WITH SCHEMABINDING
注释掉的行的函数,则ServerB
能够从再次引用该函数的视图中进行选择。
附加信息:
链接服务器对象中使用的帐户是 SQL Server Login on ServerA
,只有db_datareader
映射到它Database1
的角色(当然ServerA
除了Public
数据库角色)。它没有设置额外的细化权限,它也只分配了Public
服务器角色。
有趣的是,我的问题的另一种解决方案是授予链接服务器帐户的权限EXECUTE
或专门授予链接服务器帐户的权限。但是我不必在升级到 SQL Server 2019 之前授予权限,并且我的生产服务器(在此测试升级之前非常类似地镜像我的开发服务器)目前也没有为链接服务器帐户提供权限。Database1
ServerA
MyFunction
EXECUTE
ServerA
EXECUTE
1、2 或 3 号门:
- 从 SQL Server 2016 到 SQL Server 2019 发生了一些我没有意识到的与安全相关的变化,或者......
- 这听起来像是我遇到的错误还是...
- 你认为我把就地升级搞砸了
ServerA
吗?
关于为什么在从 SQL Server 2016升级到 SQL Server 2019后,仅通过链接服务器访问的架构绑定函数的权限ServerB
上出现权限错误的任何其他想法,简单地说?EXECUTE
ServerA
ServerA
2,加上破折号3。
所有权链应防止对从视图引用的标量 UDF 进行权限检查,因此对视图具有 SELECT 权限的用户不应该还需要视图所有者拥有的 UDF 的 EXECUTE 权限。
看起来这是 RTM 中存在并在某些 CU 中修复的众多 TSQL 标量 UDF 内联错误之一。它在 RTM 上为我重现并在升级到 CU14 后停止。
SQL Server 通常不支持累积更新(或 Service Pack*),因此安装程序会安装 RTM,然后在升级后进行修补。通常会为 GDR 更新构建更新的安装程序,但在主要版本升级后没有理由继续使用 RTM+GDR。
当我设置时,它也停止在 RTM 上这样做
*SQL Server 2017 及更高版本没有服务包,只有 CU。