在动态SQL中为每个数据库创建用户
我希望能够为登录创建一个用户并分配一些权限,我希望对名称大于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+;在动态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+;
结束'一种方法是使用光标:
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。