Gre*_*reg 21 sql t-sql sql-server permissions sql-server-2005
我需要为服务器上的所有300个数据库提供新的登录读取权限.如何在不检查用户映射区域中的300个复选框的情况下完成此操作?
Mar*_*ith 21
一种方法是在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'
Run Code Online (Sandbox Code Playgroud)
或者,你可以看看sys.sp_MSforeachdb
这里或亚伦Bertrand的改进版本在这里
如果在运行此字符时没有看到所有字符,请打开"文本查询选项"并检查"每列中显示的最大字符数"设置.确保将其设置为足以显示所有字符的值.
光标通过数据库和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
Run Code Online (Sandbox Code Playgroud)
小智 5
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'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52899 次 |
最近记录: |