SQL Server - 如何将对所有数据库的读取访问权限授予登录?

Gre*_*reg 21 sql t-sql sql-server permissions sql-server-2005

我需要为服务器上的所有300个数据库提供新的登录读取权限.如何在不检查用户映射区域中的300个复选框的情况下完成此操作?

Mar*_*ith 21

一种方法是在SSMS中的查询菜单上设置"结果到文本",然后执行以下操作.

它实际上不会进行更改,但会生成一个脚本供您查看和执行.

SET NOCOUNT ON;

DECLARE @user_name    SYSNAME
        , @login_name SYSNAME;

SELECT @user_name = 'user_name',
       @login_name = 'login_name'

SELECT '
    USE ' + QUOTENAME(NAME) + ';

    CREATE USER ' + QUOTENAME(@user_name)
       + ' FOR LOGIN ' + QUOTENAME(@login_name)
       + ' WITH DEFAULT_SCHEMA=[dbo];

    EXEC sys.sp_addrolemember
      ''db_datareader'',
      ''' + QUOTENAME(@user_name) + ''';

    EXEC sys.sp_addrolemember
      ''db_denydatawriter'',
      '''
       + QUOTENAME(@user_name) + '''; 

GO
'
FROM   sys.databases
WHERE  database_id > 4
       AND state_desc = 'ONLINE' 
Run Code Online (Sandbox Code Playgroud)

或者,你可以看看sys.sp_MSforeachdb 这里或亚伦Bertrand的改进版本在这里

如果在运行此字符时没有看到所有字符,请打开"文本查询选项"并检查"每列中显示的最大字符数"设置.确保将其设置为足以显示所有字符的值.

  • 为什么我刚刚听到这个sp_msforeachdb?我想我只是试着用我知道的工具弄清楚一切.好吧,我将它添加到工具箱中.谢谢! (2认同)

buc*_*ova 5

光标通过数据库和GRANT访问每个用一点t-sql.

我没有测试下面的代码.

DECLARE db_cursor CURSOR FOR
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name NOT IN ('master','model','msdb','tempdb') 


WHILE @@FETCH_STATUS = 0  
BEGIN  

GRANT SELECT ON DATABASE::@name to 'username'; 

FETCH NEXT FROM db_cursor INTO @name  
END 
Run Code Online (Sandbox Code Playgroud)


小智 5

EXEC sp_MSForEachDB 
'Declare @name varchar(100)
 select @name = ''?''
 PRINT @name
 IF db_id(@name) > 4
 BEGIN
 USE ?
 CREATE USER [user] FOR LOGIN [user];
EXEC sp_addrolemember ''db_datareader'', ''user''
 END'
Run Code Online (Sandbox Code Playgroud)