我有一个数据库服务器( server 2008 R2企业),它支持两个独立但相关的供应商产品,每个产品都有自己的数据库(称为X和Y)
在数据库X中,定义了许多用户,但是他们的访问权限可以归结为一些可管理的角色。我想使用这些角色中的一个来授予对Y数据库中的几个表的选择访问权限。我真的想避免在数据库Y中创建一个新角色并重新添加所有的用户,这不仅仅是因为繁忙的工作设置了安全信息,而且也是因为随着用户的来来往往,需要保持这些角色的同步。实际上,数据库X中已经存在的角色已经在逻辑上从业务角度定义了我想要的数据库Y中的访问组,而且我希望保持这种状态。
如何从X授予在Y中访问此角色的权限?
发布于 2019-08-29 16:40:33
我现在要用一种新的方式。
我在数据库X中设置了引用Y中我所关心的表的视图,然后我将对这些视图的SELECT
权限授予了我在X中关心的角色。
这一更改是在一段时间前完成的,我可能还需要一些链接服务器魔法来将身份验证/安全性处理到Y中,以避免在那里复制权限。我不记得了。但是今天,视图存在于X中,管理对该视图的访问是一项简单得多的任务。
发布于 2014-01-22 17:33:51
数据库角色是完全包含在各自数据库中的安全主体,其他数据库不能共享或可见。因此,任何在数据库X中的角色和用户都不了解数据库Y。要实现您的目标,您需要在数据库Y中重新创建角色,并将所有适当的用户添加到这个数据库和角色中。幸运的是,您可以使用系统视图编写此过程的脚本:
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'
然后,您可以将这类脚本/流程带到批处理作业中,以保持同步,但您需要某种外部进程来保持这些角色的同步。
这里可能令人困惑的一点是,您拥有连接到数据库主体的登录名和其他服务器级主体,但这两者之间有着明显的区别。我对这个答案中这些主体之间的区别提供了一些解释
发布于 2014-01-22 17:58:18
如果使用Windows身份验证,则可以将域用户添加到域组,并将此组作为登录名添加到Server。然后,为该登录提供相关数据库上所需的权限。
https://dba.stackexchange.com/questions/57300
复制相似问题