存储过程/视图访问同一服务器上的另一个数据库(安全问题)

时间:2016-07-07 10:42:34

标签: c# sql sql-server security certificate

我有一个应用程序在Microsoft SQL Server上使用数据库A中的视图,该视图对同一服务器上的不同数据库B执行SELECT查询。这是一个生产SQL服务器。问题是,服务器用户帐户只具有访问数据库A的权限。因此,当服务器运行视图选择查询时,它会收到错误:

"服务器主体" ...."无法在当前安全上下文中访问数据库B.

似乎我们必须以这种方式使用VIEW,并且为服务器(承载应用程序的IIS)授予对数据库B的访问权限风险太大

服务器是否有办法使用类似证书或类似信息的VIEW选择查询来获取数据?

如果有人能指出我正确的方向,我会很感激。谢谢!

2 个答案:

答案 0 :(得分:1)

评论时间有点长。

SQL Server具有execute as子句,可以完全按照您的要求执行(请参阅here)。此子句既可以单独使用,也可以作为create procedurecreate functionexec的选项使用。例如,您可以使用具有完全权限的用户(安全上下文)来运行查询。

您还可以定义一个在所有者的安全上下文而不是调用者中运行的函数(请参阅here,特别是示例A)。使用内联表值函数替换视图很容易;您可能必须定义一个完整的表值函数。

答案 1 :(得分:0)

您可以将用户添加到第二个数据库,但禁止其执行任何操作,只能从VIEW中选择。创建一个特殊角色,将该角色的SELECT权限授予该视图,然后将该用户添加到该角色(并将其从public和所有其他角色中删除)。