2010-06-21 72 views

回答

17

一种方法是设置“结果到文本”在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' 

或者你可以看看sys.sp_MSforeachdbas here或亚伦Bertrand的改进版本here

如果您没有看到所有的字符,当你运行它,打开查询选项的文本,并检查“设置每列中显示的最大字符数“。确保将其设置为足以显示所有字符的值。

+2

我为什么刚才听说了这个sp_msforeachdb?我想我只是尝试用我知道的工具来弄清楚所有的事情。那么,我将它添加到工具箱中。谢谢! – buckbova 2010-06-21 18:25:51

+0

谢谢!这似乎工作。我确实已将该查询的结果复制到了文本板中,并用\ nGo \ n替换了Go \ n – Greg 2010-06-21 18:41:33

+1

@Greg - 很高兴它的工作。你在Management Studio中运行过吗?如果这样,选择“结果到文本”(CTRL + T)选项可能会避免中间步骤的需要。 – 2010-06-21 18:44:09

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 
+0

在那之后使用的t-sql是我的指针混乱。任何指针呢? – Greg 2010-06-21 18:10:08

2
Declare @Databases Cursor 
Declare @DbName as nvarchar(64) 
Declare @Sql nvarchar(max) 
Declare @BaseAddUserSql nvarchar(max) 
Declare @BaseAddRoleSql nvarchar(max) 

Set @Databases = Cursor Fast_Forward For 
    select [name] 
    from master..sysdatabases 
    where [name] not in('master','model','msdb','tempdb') 

Open @Databases 
Fetch Next From @Databases Into @DbName 

Set @BaseAddUserSql = 'exec sp_adduser ''LOGINNAME''' 
Set @BaseAddRoleSql = 'exec sp_addrolemember ''db_datareader'', ''LOGINNAME''' 


While @@Fetch_Status = 0 
Begin 
    Begin Try 
     Set @Sql = 'Use ' + Quotename(@DbName) 
     exec (@Sql) 

     Set @Sql = Replace(@BaseAddUserSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 

     Set @Sql = Replace(@BaseAddRoleSql, 'LOGINNAME', <loginname>) 
     exec(@Sql) 
    End Try 
    Begin Catch 
    End Catch 

    Fetch Next From @Databases Into @DbName 
End 

Close @Databases 
Deallocate @Databases 
+0

它说它成功完成,但我没有看到任何更改。用户映射区域没有改变。我为输入的登录名不会以任何数据库中的用户身份出现。有任何想法吗? – Greg 2010-06-21 18:26:16

+0

@Greg - 您可能想要将Try-Catch块注释掉以查看正在抛出的错误。 – Thomas 2010-06-21 19:10:59

3
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' 
2

我不得不稍微调整马丁·史密斯的回答是:

  1. 的空格和换行导致不是所有的文字被正确地产生
  2. 在exec语句放在QUOTENAME方括号不正确。

我的版本:

SET NOCOUNT ON; 

DECLARE @user_name SYSNAME 
     , @login_name SYSNAME; 

SELECT @user_name = 'HelpdeskUser', 
     @login_name = 'Helpdesk' 

SELECT 'USE ' + QUOTENAME(NAME) + '; 
     CREATE USER ' + QUOTENAME(@user_name) 
     + ' FOR LOGIN ' + QUOTENAME(@login_name) 
     + ' WITH DEFAULT_SCHEMA=[dbo]; 
    EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + '''; 
    EXEC sys.sp_addrolemember ''db_denydatawriter'', ''' + @user_name + '''; 
GO' 
FROM sys.databases 
WHERE database_id > 4 
     AND state_desc = 'ONLINE' 

否则完美的作品。 感谢

0

我只是需要,将有机会获得与数据读写权限的所有数据库,所以我用这个代码用户: 您需要BTW运行从查询结果。

USE [master] 
GO CREATE LOGIN [DOMAIN\USER] FROM WINDOWS WITH DEFAULT_DATABASE=[master] GO 
select 'use ['+name+'] 
CREATE USER [DOMAIN\USER] FOR LOGIN [DOMAIN\USER] 
EXEC sp_addrolemember N''db_datareader'', N''DOMAIN\USER'' 
' 
from sys.databases 

,如果你不想把它在系统数据库只需添加 其中database_id的> 6

0

可以使用例如光标,像这样:

USE master 
GO 

DECLARE @DatabaseName VARCHAR(32) 
DECLARE @SQL NVARCHAR(max) 
DECLARE @User VARCHAR(64) 
SET @User = '[SQL\srvSSISAcc]' --Your User 

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

OPEN Grant_Permission 
FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @SQL = 'USE '+ '[' + @DatabaseName + ']' +'; '+ 'CREATE USER ' + @User + 
    'FOR LOGIN ' + @User + '; EXEC sp_addrolemember N''db_datareader'', 
    ' + @User + '; EXEC sp_addrolemember N''db_datawriter'', ' + @User + '' 

    EXEC sp_executesql @SQL 
    PRINT @SQL 

FETCH NEXT FROM Grant_Permission INTO @DatabaseName 
END 
CLOSE Grant_Permission 
DEALLOCATE Grant_Permission 

更多info在我的帖子中找到关于此主题的: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases

相关问题