1

我有 2 个数据库,我们称它们为Database1Database2,一个权限非常有限的用户,我们称它为User1 ,以及Database1中的一个存储过程,我们称它为Proc1

我在Proc1上授予User1EXECUTE权限;只要所有引用的表(对于 SELECT、UPDATE ...等)都在Database1中,事情就可以正常工作,尽管User1对这些表没有明确的权限。GRANT EXECUTE ON [dbo].[Proc1] TO [User1]

我在Database2中将Proc1修改为 SELECT ,我们称之为Table1。现在,当我执行Proc1时,我收到以下错误:对象 'Table1'、数据库 'Database2'、架构 'dbo' 的 SELECT 权限被拒绝

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

笔记:

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

4 回答 4

1

SQL Server 检查权限链中的权限时似乎有所不同。具体来说:

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

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

于 2013-10-01T07:07:14.363 回答
0

迟到了,但我建议看看这个场景的签名存储过程。它们比授予用户对多个数据库的权限或打开数据库所有权链接要安全得多。

...要使用户可以在没有 SELECT 权限的情况下在 testtbl 上运行此过程,您需要执行以下四个步骤:

1.创建证书。

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

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

4.每次更改程序时,使用证书签署程序。

当调用该过程时,证书用户的权限被添加到实际用户的权限中。...

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

MSDN 上还提供了更多文档。

于 2015-01-15T17:37:55.397 回答
0

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

于 2017-04-10T18:16:22.177 回答
0

要在 2018 年底使用 Microsoft 的更新文本扩展 @Szymon 的答案:

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

  • 数据库所有者和db_ddladmin数据库db_owners角色的成员可以创建其他用户拥有的对象。这些对象可能以其他数据库中的对象为目标。这意味着如果您启用跨数据库所有权链接,您必须完全信任这些用户拥有所有数据库中的数据。

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

还提到了@Rozwel 在他们的回答中提到的过程的动态 SQL 和证书签名。

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

于 2018-12-28T16:09:01.783 回答