首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >轻松地让一个数据库中的角色访问同一服务器上另一个数据库中的表。

轻松地让一个数据库中的角色访问同一服务器上另一个数据库中的表。
EN

Database Administration用户
提问于 2014-01-22 17:09:03
回答 3查看 2.4K关注 0票数 6

我有一个数据库服务器( server 2008 R2企业),它支持两个独立但相关的供应商产品,每个产品都有自己的数据库(称为X和Y)

在数据库X中,定义了许多用户,但是他们的访问权限可以归结为一些可管理的角色。我想使用这些角色中的一个来授予对Y数据库中的几个表的选择访问权限。我真的想避免在数据库Y中创建一个新角色并重新添加所有的用户,这不仅仅是因为繁忙的工作设置了安全信息,而且也是因为随着用户的来来往往,需要保持这些角色的同步。实际上,数据库X中已经存在的角色已经在逻辑上从业务角度定义了我想要的数据库Y中的访问组,而且我希望保持这种状态。

如何从X授予在Y中访问此角色的权限?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2019-08-29 16:40:33

我现在要用一种新的方式。

我在数据库X中设置了引用Y中我所关心的表的视图,然后我将对这些视图的SELECT权限授予了我在X中关心的角色。

这一更改是在一段时间前完成的,我可能还需要一些链接服务器魔法来将身份验证/安全性处理到Y中,以避免在那里复制权限。我不记得了。但是今天,视图存在于X中,管理对该视图的访问是一项简单得多的任务。

票数 1
EN

Database Administration用户

发布于 2014-01-22 17:33:51

数据库角色是完全包含在各自数据库中的安全主体,其他数据库不能共享或可见。因此,任何在数据库X中的角色和用户都不了解数据库Y。要实现您的目标,您需要在数据库Y中重新创建角色,并将所有适当的用户添加到这个数据库和角色中。幸运的是,您可以使用系统视图编写此过程的脚本:

代码语言:javascript
运行
复制
USE [Y];
CREATE ROLE foo;

--grant all perms on foo

--Use this generate sql to add all your users to the role
select 'CREATE USER '+quotename(u.name)+';' + char(10)+
       'EXEC sp_addrolemember ''foo'','''+u.name+''';'
from (select name,principal_id
        from x.sys.database_principals where type = 'R') r
    join x.sys.database_role_members rm 
        on (r.principal_id = rm.role_principal_id)
    join (select name,type_desc,principal_id
        from x.sys.database_principals where type != 'R') u 
        on (rm.member_principal_id = u.principal_id )
where r.name = 'foo'

然后,您可以将这类脚本/流程带到批处理作业中,以保持同步,但您需要某种外部进程来保持这些角色的同步。

这里可能令人困惑的一点是,您拥有连接到数据库主体的登录名和其他服务器级主体,但这两者之间有着明显的区别。我对这个答案中这些主体之间的区别提供了一些解释

票数 3
EN

Database Administration用户

发布于 2014-01-22 17:58:18

如果使用Windows身份验证,则可以将域用户添加到域组,并将此组作为登录名添加到Server。然后,为该登录提供相关数据库上所需的权限。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/57300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档