在动态SQL中为每个数据库创建用户

在动态SQL中为每个数据库创建用户,sql,sql-server,Sql,Sql Server,我希望能够为登录创建一个用户并分配一些权限,我希望对名称大于4的数据库执行此操作 EXEC sp_MSForEachDB 'Declare@name varchar100,@UserToAdd varchar100=HQ\t名称 选择@name=? 打印@name IF-db_id@name > 4 开始 使用 EXEC创建用户[+@UserToAdd+]以登录[+@UserToAdd+]; EXEC EXEC sp_addrolemember Ndb_数据读取器,N+@UserToAdd+;

我希望能够为登录创建一个用户并分配一些权限,我希望对名称大于4的数据库执行此操作

EXEC sp_MSForEachDB 'Declare@name varchar100,@UserToAdd varchar100=HQ\t名称 选择@name=? 打印@name IF-db_id@name > 4 开始 使用 EXEC创建用户[+@UserToAdd+]以登录[+@UserToAdd+]; EXEC EXEC sp_addrolemember Ndb_数据读取器,N+@UserToAdd+;
结束'一种方法是使用光标:

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;

有时需要四个引号才能在SQLtoExec中获得一个引号,查看是否正确的快速方法是将exec更改为print,然后您将看到它试图使用的sql。