SQL Server 链权限

TTC*_*TCG 2 sql-server permissions access-control sql-server-2012 signature

我们有 2 个数据库。

  • 报告
  • 人力资源

有一些用户想要从 HR 数据库中提取数据。但我们不想直接访问该 HR 数据库。

因此,我们在 Reporting 数据库中创建了特殊视图,并且用户拥有该 Reporting 数据库的dbowner权限。

但是,当他们尝试运行查询时,错误消息显示...

The server principal "test" is not able to access the database "HR" under the current security context. 
Run Code Online (Sandbox Code Playgroud)

当我授予他们作为HR 数据库的db_datareader阅读器时,一切都很好,他们可以运行查询。但它破坏了安全性,我们不希望他们直接访问 HR 数据库。这就是我们在报告数据库中制作特殊视图的原因。

如何让这些用户在不直接访问 HR 数据库的情况下运行视图/查询?

Sol*_*zky 5

除非您启用了跨数据库所有权链接(默认情况下关闭)并且在两个数据库中具有相同的用户,否则授予对一个数据库中的对象的访问权限并不意味着对其他数据库的任何许可。当然,我不建议启用跨数据库所有权链接,Microsoft 也不建议启用。

相反,您应该创建一个证书,该证书可用于对模块进行签名并充当数据库之间权限的代理。问题在于它们适用于存储过程、函数(非内联 TVF)、程序集和触发器。但是这种方法允许那些不应该对[HR]数据库有任何访问权限的用户实际上没有任何访问权限:它是具有访问权限的代码(即模块)。

基本概念:

  • 在中创建证书 [Reporting]
  • 在中创建存储过程[Reporting](直接从 中的表中选择[HR]
  • 用于ADD SIGNATURE使用证书对新存储过程进行签名
  • 将证书备份到文件
  • [HR]您刚刚创建的备份文件中创建证书(两个地方的证书需要相同!)
  • [HR]在证书中创建用户
  • GRANT SELECT对新的基于证书的用户的适当表[HR](即新存储过程中的引用[Reporting])的权限
  • 回家享受剩下的一天吧:)

一些资源:

或者,如果您更喜欢使用视图的简单性,那么您的视图位于错误的数据库中。您需要改为:

  • 将适当的用户添加到 [HR] 数据库,以便有基本访问权限,但不要向任何表授予任何权限(希望没有组或角色成员资格暗示此类权限)
  • 在 [HR] 数据库中创建所需的视图
  • GRANT SELECT 仅针对这些视图,而不针对其他任何内容,针对这些用户