问题:
- 我有一个 SQL Server 2005 服务器和一个 SQL Server 2016 服务器。
- 每台服务器上都有一个数据库 (A),其中包含一个存储过程,用于从数据库 (A) 的视图中选择数据
- 数据库 (A) 中的视图引用同一服务器上数据库 (B) 中的表
- 我使用的登录仅对数据库 (A) 上的存储过程具有执行权限。
- 此设置对于两台服务器都是相同的。
- 在 2005 服务器上,我可以按照所描述的登录方式运行 SP,并通过数据库 (A) 中的视图从数据库 (B) 中的表检索数据——如我所料。
- 在 2016 服务器上,我收到一个错误,因为从数据库 (A) 我无法通过 SP 和视图从数据库 (B) 的表中选择数据。
两台服务器都运行 SQL Server Standard Edition -(虽然一台是 2005 年,一台是 2016 年)。
总结一下:
SQL Server 2005
- 数据库 A = 视图 = 数据库 B 中的表
- 数据库 A = 存储过程 = 从视图中选择
- LOGON = 仅在存储过程中执行
- 结果 = 成功
SQL Server 2016
- 设置看起来完全相同
- 结果 = 失败
为什么是这样?这两个版本的 SQL 在权限继承方面有何不同?我想念的东西很明显吗?
任何指针都会非常有帮助!
我不希望不同的 SQL Server 版本在这里有所作为。尽管设置可能看起来相同,但两台服务器上的数据库或服务器配置之间可能存在细微差别。
我建议的第一件事是验证是否满足跨数据库所有权链接的要求:
确保两台服务器上的“cross db ownership chaining”配置选项相同
确保
DB_CHAINING
数据库选项相同检查数据库所有者是否相同,以维护 dbo 拥有的对象的完整所有权链
如果罪魁祸首是“cross db ownership chaining”服务器选项,最好不要使用它,而是
DB_CHAINING
为有问题的 SQL 2016 数据库打开更精细的数据库选项。如果您在上述操作后仍然有问题,请发布实际的错误消息。