SQL Server角色和权限

时间:2019-03-26 21:28:02

标签: sql-server

我真的需要一些有关在服务器级别添加角色的建议,并应用一些适用于服务器上每个数据库的权限。

基本上,我需要两个角色为只读和读写。 读取将具有选择和查看任何对象的权限 写入将具有选择/插入/删除和执行任何对象的权限

我要创建一个服务器角色,然后创建与此角色(可以是AD组)相关联的登录名,然后为每个数据库创建一个将从服务器角色继承所有权限的用户。

因此,在每个数据库上,我将创建一个属于服务器角色的每个用户,问题是要明确定义权限,我认为这不是直截了当的。

我看到的是,我无法分配对某个角色的读取或写入,然后在每个数据库上使用它,相反,在服务器角色的“常规”选项卡上,我有一堆权限不明确,该使用哪个权限以此目的。

也许我做错了,但是我想在服务器级别拥有一些东西,而不是为此目的在每个数据库上定义相同的角色。我正在使用SQL Server 2014。

1 个答案:

答案 0 :(得分:0)

简短的回答是您不能

通常,服务器级别的权限不会向下传播到数据库内的各个对象。唯一的例外是sysadmin角色,我强烈建议您不要用于此目的,因为您实际上将放弃对整个服务器实例的控制权给它的每个成员

作为一种简写,您可以使用内置的数据库角色来为自己节省一些麻烦。对于只读访问,通常具有db_datareader角色的成员资格就足够了,除非您有存储过程返回了该角色应该能够执行的数据集。修改还有一个类似的角色db_datawriter,但它不涉及execute权限。因此,您必须为此创建一个自定义角色:

create role [DataChanger] authorization [dbo];
go
alter role [db_datareader] add member [DataChanger];
go
alter role [db_datawriter] add member [DataChanger];
go
grant execute to [DataChanger];
go

-- Now you can add your members. Here is a reader
create user [Domain\MyUser1] from login [Domain\MyUser1];
go
alter role [db_datareader] add member [Domain\MyUser1];
go
-- Writer
create user [Domain\MyUser2] from login [Domain\MyUser2];
go
alter role [DataChanger] add member [Domain\MyUser2];
go

这些权限将自动拾取新创建的对象,而无需在每次模式修改后显式添加新权限。

您将必须在要以此方式管理的每个用户数据库的上下文中执行此操作。您可能可以创建一个将定期运行的SQL Agent作业,并将这些更改引入尚未包含这些更改的任何用户数据库中(例如,如果数据库是从较早的备份中还原的,或者是从另一台服务器恢复的,或者是新数据库)一个被创建)。另外,由于您无法以静态代码循环访问数据库,因此您需要将其包装到动态SQL中并通过sys.databases或可能通过 undocumented sp_MSforeachdb进行循环系统存储过程。哦,别忘了从动态代码中删除所有这些go语句,因为它们不是SQL的一部分,并且只能被SSMS和sqlcmd识别。

P.S。话虽如此,我希望您不要以这种方式管理任何生产数据库。我什至不知道该如何从不安全的角度着手。