将数据库主体应用于服务器中的所有数据库(针对特定用户)





5.00/5 (1投票)
如何为特定 SQL Server 上的所有数据库中的特定用户授予 `db_datareader` 访问权限
你是否遇到过这样的需求:需要为特定 SQL Server 上的所有数据库中的特定用户授予 `db_datareader` 访问权限? 如果同一个 SQL Server 中的数据库数量不多,这项任务很简单。 但是,如果数据库数量很多,这将会非常耗时。
可以通过 GUI (SSMS) 或 T-SQL 脚本来完成此操作。 我们将考虑这两种方法。
使用 SQL Server Management Studio
为了说明这一点,我们将创建一个 SQL 登录名 ‘db_user_read_only
’,并赋予其 ‘public
’ 服务器角色,然后在用户映射中应用 `db_datareader` 主体。
如前所述,当数据库数量较少时,使用 GUI 会更容易。 但是,如果 SQL Server 包含大量数据库,这将是一项非常耗时的任务。 那么使用后一种方法会非常方便。
使用 T-SQL
可以使用以下脚本将 `db_datareader` 主体应用于特定服务器上的所有数据库。
DECLARE
@Sql AS NVARCHAR(MAX)
,@UserId AS VARCHAR(MAX) = 'YourLoginId'
SET @Sql = CONCAT('
USE [?];
IF EXISTS (SELECT 0 FROM sys.database_principals AS DP WHERE name = ''',@UserId,''')
BEGIN
EXEC sys.sp_change_users_login ''update_one'',''',@UserId,''',''',@UserId,'''
END
ELSE
CREATE USER [',@UserId,'] FOR LOGIN [',@UserId,']
ALTER ROLE [db_datareader] ADD MEMBER [',@UserId,']
')
EXEC sys.sp_MSforeachdb
@command1 = @Sql
,@replacechar = '?'
请注意以下几点:
- 在上面的代码中,我没有排除系统数据库。
- 如果登录名存在于数据库中,它将使用 `sp_change_users_login` 映射数据库用户。
希望这能对你有所帮助。