简体   繁体   English

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

[英]CREATE USER in Dynamic SQL for each database

I want to be able to create a user for a login and assign some permission, and I want to do this for databases whose name is > 4 Here's what I have 我希望能够为登录创建用户并分配一些权限,并且我想对名称> 4的数据库执行此操作

 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' 

I'm having some trouble with the syntax using multiple quotes, If I just run this for an individual database I know it works using the following code 我在使用多引号的语法上遇到了一些麻烦,如果仅对单个数据库运行它,我知道它可以使用以下代码运行

 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 

Could anyone help out with the syntax? 有人可以帮忙语法吗?

One way to do this is with a cursor: 一种方法是使用游标:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM