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 数据库的情况下运行视图/查询?
除非您启用了跨数据库所有权链接(默认情况下关闭)并且在两个数据库中具有相同的用户,否则授予对一个数据库中的对象的访问权限并不意味着对其他数据库的任何许可。当然,我不建议启用跨数据库所有权链接,Microsoft 也不建议启用。
相反,您应该创建一个证书,该证书可用于对模块进行签名并充当数据库之间权限的代理。问题在于它们适用于存储过程、函数(非内联 TVF)、程序集和触发器。但是这种方法允许那些不应该对[HR]
数据库有任何访问权限的用户实际上没有任何访问权限:它是具有访问权限的代码(即模块)。
基本概念:
[Reporting]
[Reporting]
(直接从 中的表中选择[HR]
)ADD SIGNATURE
使用证书对新存储过程进行签名[HR]
您刚刚创建的备份文件中创建证书(两个地方的证书需要相同!)[HR]
在证书中创建用户GRANT SELECT
对新的基于证书的用户的适当表[HR]
(即新存储过程中的引用[Reporting]
)的权限一些资源:
或者,如果您更喜欢使用视图的简单性,那么您的视图位于错误的数据库中。您需要改为:
GRANT SELECT
仅针对这些视图,而不针对其他任何内容,针对这些用户 归档时间: |
|
查看次数: |
915 次 |
最近记录: |