我有一个名为数据库B的受限数据库(包含机密数据),只有几个用户可以访问它。但是,我需要从B中的几个表中选择一些数据,以供请求它的用户使用。请求数据的用户不会作为数据库用户添加到数据库B,因为他们无权访问。但是,这些用户可以访问数据库A(他们被添加为 DB A的 DB 用户)。有没有办法让存储过程访问机密数据库 ( B ),以便运行 SP 的任何用户都可以获得他们请求的数据?如果是这样,如何?我研究过这是可能的,但没有提到如何。
注意:通过 IS 包将所需数据从数据库B移动到A不是一个选项(假设需要实时访问)。我也考虑过使用视图(但又一次,如何?如果您无权访问基表,您也将无法通过视图访问数据)。
这很容易实现(包括处理多个数据库和动态 SQL),无需任何模拟(
IMPERSONATE
许可)、跨数据库所有权链接(服务器/实例或数据库设置)或TRUSTWORTHY
(数据库设置)。一般来说,你需要做的是:例子:
清理
设置
测试
有关模拟与模块签名的更多信息,您可以查看我的其他答案(以及其中链接的答案):
SQL Server 模拟不工作
在服务器上创建一个用户帐户。在您希望他们具有有限访问权限的数据库中创建没有权限的用户。他们目前无权访问该数据库中的任何内容。
使用所需的有限列和权限创建所需表的视图。然后配对该用户以访问视图。
现在在您希望他们使用的数据库中,您可以在那里创建一个过程,该过程引用您想要的视图,同时限制他们的权限并且不允许他们访问基础表,以便他们现在可以进行更高级别的数据聚合。
这确实违反了无法添加他们对您的问题的请求,但这是一个很好的解决方法,同时让他们除了那个视图之外没有对该数据库中任何内容的实际访问权限。正如您的问题所述,他们不需要访问表,而是访问数据库。您将看到的错误实际上是:
这个想法能解决问题吗?下面的例子。
基本上,您需要在安全数据库之外创建一个进程,以允许非授权用户以非常有限的方式查看数据。执行此操作的最简单方法是创建一个带有 EXECUTE AS 子句的存储过程,为过程中的代码提供公开所选数据所需的权限,但除此之外保持权限锁定。这看起来像: