将多个服务器登录映射到一个数据库用户

lee*_*rog 11 sql-server permissions t-sql

这似乎是一个愚蠢的问题,但尽管进行了一些研究,但我无法仅找到有关此的任何信息(可能是由于使用了错误的术语)。

是否可以将多个服务器登录(sql server 身份验证)记录到单个数据库用户(具有通过成为数据库角色成员分配的权限)?

我有几十个 sql 登录(sql server 身份验证),它们需要从中央数据库读取一个设置,我宁愿将所有这些登录都映射到目标数据库中的单个 DB 用户,而不是为每个登录创建一个自己的 DB 用户。

如果是,那么正确的 T-SQL 语法是什么?

Ken*_*her 20

首先要确定术语。Login 是实例级别的安全主体 ( sys.server_principals),而 User 是数据库级别的安全主体 ( sys.database_principals)。它们通过 SID(安全标识符)连接在一起。如果您查看上面的系统视图,您可以看到它们是如何通过 SID 以 1:1 格式连接在一起的。这是 1 个登录到数据库中的 1 个用户。一个登录名可以有多个用户,但他们必须在不同的数据库中。

因此,您需要在您的数据库中为您想要访问它的每个登录创建一个用户。这是一个足够简单的命令。

CREATE USER [UserName] FROM LOGIN [LoginName]
Run Code Online (Sandbox Code Playgroud)

从那里您可以将所有用户置于一个(或多个)角色中。角色是具有权限并与每个用户(对于数据库角色)或登录名(例如角色)共享这些权限的容器。有一个名为的内置数据库角色db_datareader,它提供对数据库中每个表和视图的读取访问权限。您可以将所有用户添加到该角色。但是,更好的主意是创建一个新角色并将其添加到db_datareader角色中。然后将所有用户添加到新角色。这样做的好处是,如果您想向组添加其他权限,只需更改角色的权限即可。

通过以下方式创建角色:

CREATE ROLE RoleName
Run Code Online (Sandbox Code Playgroud)

将用户添加到角色(或将一个角色添加到另一个角色)

EXEC sp_addrolemember 'RoleName','UserName'
Run Code Online (Sandbox Code Playgroud)

或者如果您在 2012 年或更高

ALTER ROLE [RoleName] ADD MEMBER [UserName]
Run Code Online (Sandbox Code Playgroud)