2015-03-18 42 views
0

我希望能够创建一个用户的登录和分配一些权限,我要为数据库名称为> 4这里做到这一点就是我有动态SQL CREATE USER每个数据库

EXEC sp_MSForEachDB 
 
'Declare @name varchar(100), @UserToAdd VARCHAR(100) = ''HQ\tname'' 
 
select @name = ''?'' 
 
PRINT @name 
 
IF db_id(@name) > 4 
 

 
BEGIN 
 
USE ? 
 
EXEC (''CREATE USER ['' + @UserToAdd + ''] FOR LOGIN ['' + @UserToAdd + ''];'') 
 
EXEC (''EXEC sp_addrolemember N''db_datareader'', N'''' + @UserToAdd + '''';'') 
 
END'

我使用多个报价,如果我只是运行此为一个单独的数据库,我知道它使用下面的代码

DECLARE @UserToAdd VARCHAR(100) = 'HQ\tname' 
 
BEGIN 
 
USE [dbnamehere] 
 
EXEC ('CREATE USER [' + @UserToAdd + '] FOR LOGIN [' + @UserToAdd + '];') 
 
EXEC ('EXEC sp_addrolemember N''db_datareader'', N''' + @UserToAdd + ''';') 
 
END
遇到一些麻烦的语法10

谁能帮忙的语法?要做到这一点

+0

有时需要四个报价在SQL给exec获得报价,看的快捷方式,如果你有它的权利是改变exec来打印,你会看到它正在尝试使用的SQL。 – 2015-03-18 20:49:47

回答

0

一种方式是使用光标:

declare 
    @sql nvarchar(max), 
    @db sysname, 
    @UserToAdd sysname = 'HQ\tname'; 

declare db_cursor cursor local fast_forward for 
select 
    name 
from 
    sys.databases 
where 
    database_id > 4; 

open db_cursor; 

fetch next from db_cursor into @db; 

while @@fetch_status = 0 
begin 
    set @sql = 'use ' + quotename(@db) + '; 
    create user ' + quotename(@UserToAdd) + ' for login ' + quotename(@UserToAdd) + '; 
    exec sp_addrolemember ''db_datareader'', ' + quotename(@UserToAdd, '''') + ';'; 
    exec sp_executesql @sql; 
    fetch next from db_cursor into @db;   
end; 

close db_cursor; 
deallocate db_cursor; 
+0

感谢这实际上非常好。 – Victor 2015-03-18 21:10:57