【问题标题】:How to Configure a Stored Procedure to Access a Table in Another Database如何配置存储过程以访问另一个数据库中的表
【发布时间】:2013-09-18 00:45:22
【问题描述】:

我在同一个 SQL Server 上有两个数据库:

数据库A

  • 表 1
  • 表2
  • sproc x

数据库B

  • 表 3
  • 表 4
  • sproc y
  • sproc z

我想授予 user1 对数据库的访问权限,但只能通过存储过程的 EXECUTE 权限。

  • sproc x 在表 1 和 2,user1可以执行。
  • sproc y 在表 3 之间进行连接 & 4,user1可以执行。
  • sproc z 在表 1 之间进行连接 & 4、user1无法执行, 除非我授予 SELECT 权限 表 1. 为什么会这样?

我不想授予select权限,因为这打破了“只通过sprocs访问数据库”的安全模型

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    您可能需要为两个数据库启用cross database ownership chaining

    查看是否启用:

    select name, is_db_chaining_on
        from sys.databases
    

    启用设置:

    EXEC sp_dboption 'DatabaseA', 'db_chaining', 'true';
    GO
    
    EXEC sp_dboption 'DatabaseB', 'db_chaining', 'true';
    GO
    

    【讨论】:

    • 它没有启用...我为我的 sproc 尝试访问的数据库启用了它,它似乎可以工作。谢谢!
    • 因为我在一些最近的数据库中遇到了这个问题,所以需要检查一些额外的项目。 1)使两个数据库的数据库所有者相同 2)确保两个数据库中存在相同的用户/组
    【解决方案2】:

    我确实遇到了这个问题,但在我的情况下,解决方案是更新两个数据库以拥有相同的所有者。

    如果数据库由同一所有者拥有,则无需显式打开所有权链接(因为所有者是同一个人)。

    这里有很棒的文章:[http://www.sommarskog.se/grantperm.html][1]

    对于更新的版本,您可以使用 sp_changedbowner 或“ALTER AUTHORIZATION”语句更新数据库的所有权。

    【讨论】:

    • 这只是发生在我们最近创建的一些数据库中——我们忘记将所有者更改为 SA,而另一个示例中的 db_chaining 选项不起作用。一旦我们将所有者更改为 SA,它就起作用了。请注意,我们仍然需要将 db_chaining 设置为 true
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多