65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2018年9月10日

CPOL

1分钟阅读

viewsIcon

4735

如何为特定 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` 主体。

image

image

image

如前所述,当数据库数量较少时,使用 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` 映射数据库用户。

希望这能对你有所帮助。

© . All rights reserved.