GRANT EXECUTE和跨数据库引用如何在SQL Server中工作?

时间:2013-10-01 05:00:15

标签: sql sql-server

我有2个数据库,我们称之为 Database1 Database2 ,权限非常有限的用户,我们称之为 User1 ,和 Database1 中的存储过程,我们称之为 Proc1

我对 Proc1 上的 User1 授予EXECUTE权限;只要所有引用的表(对于SELECT,UPDATE等等)都在 Database1 中,GRANT EXECUTE ON [dbo].[Proc1] TO [User1]就行了,但是 User1 没有对这些表的明确许可。

我从表格中将 Proc1 修改为SELECT,我们在 Database2 中将其称为 Table1 。现在当我执行 Proc1 时,我收到以下错误:对象'Table1',数据库'Database2',架构'dbo'

上的SELECT权限被拒绝

我的理解是,当我向存储过程授予EXECUTE时,SQL Server将负责所需的权限。当表(或对象)在另一个数据库中时,它会以不同的方式工作吗?

注意:

  • User1 是具有相同权限的两个数据库中的用户
  • 我正在使用SQL Server 2005

4 个答案:

答案 0 :(得分:1)

当SQL Server检查权限链中的权限时,似乎有所不同。具体做法是:

  

可以将SQL Server配置为允许特定数据库之间或SQL Server单个实例内所有数据库之间的所有权链接。默认情况下禁用跨数据库所有权链接,除非特别需要,否则不应启用它。

(资料来源:http://msdn.microsoft.com/en-us/library/ms188676.aspx

答案 1 :(得分:0)

晚会,但我建议您查看此方案的已签名存储过程。它们比授予用户对多个数据库的权限或打开数据库所有权链接更安全。

  

...使用户无需运行此过程   对testtbl的SELECT权限,您需要执行以下四个步骤:

     

1.创建证书。

     

2.创建与该证书关联的用户。

     

3.授予用户对testtbl的SELECT权限。

     

4.每次更改程序时,请在证书上签名。

     

调用过程时,证书用户的权限是   添加到实际用户的权利。 ...

(来自http://www.sommarskog.se/grantperm.html#Certificates

MSDN上还提供了进一步的文档。

答案 2 :(得分:0)

确保两个数据库中的用户实际上是相同的。不只是命名相同。尝试从两个数据库中删除用户,然后在SERVER用户下创建用户,并从该单个用户帐户为每个数据库分配适当的权限。

答案 3 :(得分:0)

要在@Szymon的答案中扩展Microsoft于2018年底发布的更新文本:

  

默认情况下,跨数据库的所有权链接处于关闭状态。 Microsoft建议您禁用跨数据库所有权链接,因为它会使您面临以下安全风险:

     
      
  • 数据库所有者和db_ddladmindb_owners数据库角色的成员可以创建其他用户拥有的对象。这些对象可以潜在地针对其他数据库中的对象。这意味着,如果启用跨数据库所有权链接,则必须使用所有数据库中的数据完全信任这些用户。

  •   
  • 具有CREATE DATABASE权限的用户可以创建新数据库并附加现有数据库。如果启用了跨数据库所有权链接,则这些用户可以从他们创建的新创建的数据库或附加的数据库访问他们可能没有权限的其他数据库中的对象。

  •   

还提到了有关动态SQL和证书签名的问题,例如@Rozwel在其答案中提到的过程。

(来源:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server