我需要为服务器上的所有300个数据库提供新的登录读取访问权限。如何在不检查用户映射区域中的300个复选框的情况下完成此操作?SQL Server - 如何授予所有数据库的读取权限以登录?
16
A
回答
17
一种方法是设置“结果到文本”在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'
或者你可以看看sys.sp_MSforeachdb
as here或亚伦Bertrand的改进版本here
如果您没有看到所有的字符,当你运行它,打开查询选项的文本,并检查“设置每列中显示的最大字符数“。确保将其设置为足以显示所有字符的值。
5
游标通过数据库和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
+0
在那之后使用的t-sql是我的指针混乱。任何指针呢? – Greg 2010-06-21 18:10:08
2
Declare @Databases Cursor
Declare @DbName as nvarchar(64)
Declare @Sql nvarchar(max)
Declare @BaseAddUserSql nvarchar(max)
Declare @BaseAddRoleSql nvarchar(max)
Set @Databases = Cursor Fast_Forward For
select [name]
from master..sysdatabases
where [name] not in('master','model','msdb','tempdb')
Open @Databases
Fetch Next From @Databases Into @DbName
Set @BaseAddUserSql = 'exec sp_adduser ''LOGINNAME'''
Set @BaseAddRoleSql = 'exec sp_addrolemember ''db_datareader'', ''LOGINNAME'''
While @@Fetch_Status = 0
Begin
Begin Try
Set @Sql = 'Use ' + Quotename(@DbName)
exec (@Sql)
Set @Sql = Replace(@BaseAddUserSql, 'LOGINNAME', <loginname>)
exec(@Sql)
Set @Sql = Replace(@BaseAddRoleSql, 'LOGINNAME', <loginname>)
exec(@Sql)
End Try
Begin Catch
End Catch
Fetch Next From @Databases Into @DbName
End
Close @Databases
Deallocate @Databases
3
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'
2
我不得不稍微调整马丁·史密斯的回答是:
- 的空格和换行导致不是所有的文字被正确地产生
- 在exec语句放在QUOTENAME方括号不正确。
我的版本:
SET NOCOUNT ON;
DECLARE @user_name SYSNAME
, @login_name SYSNAME;
SELECT @user_name = 'HelpdeskUser',
@login_name = 'Helpdesk'
SELECT 'USE ' + QUOTENAME(NAME) + ';
CREATE USER ' + QUOTENAME(@user_name)
+ ' FOR LOGIN ' + QUOTENAME(@login_name)
+ ' WITH DEFAULT_SCHEMA=[dbo];
EXEC sys.sp_addrolemember ''db_datareader'',''' + @user_name + ''';
EXEC sys.sp_addrolemember ''db_denydatawriter'', ''' + @user_name + ''';
GO'
FROM sys.databases
WHERE database_id > 4
AND state_desc = 'ONLINE'
否则完美的作品。 感谢
0
我只是需要,将有机会获得与数据读写权限的所有数据库,所以我用这个代码用户: 您需要BTW运行从查询结果。
USE [master]
GO CREATE LOGIN [DOMAIN\USER] FROM WINDOWS WITH DEFAULT_DATABASE=[master] GO
select 'use ['+name+']
CREATE USER [DOMAIN\USER] FOR LOGIN [DOMAIN\USER]
EXEC sp_addrolemember N''db_datareader'', N''DOMAIN\USER''
'
from sys.databases
,如果你不想把它在系统数据库只需添加 其中database_id的> 6
0
可以使用例如光标,像这样:
USE master
GO
DECLARE @DatabaseName VARCHAR(32)
DECLARE @SQL NVARCHAR(max)
DECLARE @User VARCHAR(64)
SET @User = '[SQL\srvSSISAcc]' --Your User
DECLARE Grant_Permission CURSOR LOCAL FOR
SELECT name FROM MASTER.dbo.sysdatabases
WHERE name NOT IN ('master','model','msdb','tempdb')
OPEN Grant_Permission
FETCH NEXT FROM Grant_Permission INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @SQL = 'USE '+ '[' + @DatabaseName + ']' +'; '+ 'CREATE USER ' + @User +
'FOR LOGIN ' + @User + '; EXEC sp_addrolemember N''db_datareader'',
' + @User + '; EXEC sp_addrolemember N''db_datawriter'', ' + @User + ''
EXEC sp_executesql @SQL
PRINT @SQL
FETCH NEXT FROM Grant_Permission INTO @DatabaseName
END
CLOSE Grant_Permission
DEALLOCATE Grant_Permission
更多info在我的帖子中找到关于此主题的: http://www.pigeonsql.com/single-post/2016/12/23/Grant-User-Access-to-All-Databases
相关问题
- 1. 授予SQL Server登录访问数据库的权限 - SQL Server
- 2. SQL Server:授予所有用户对数据库的读取访问权限
- 3. 如何将用户的读取权限授予SQL Server中的数据库?
- 4. 如何授予重命名数据库sql-server的权限
- 5. 如何在sql server 2008中授予登录权限?
- 6. 如何授予SQL Server读取我的SSL密钥的权限?
- 7. Azure SQL Server - 如何授予用户只读访问主数据库的权限
- 8. 如何将权限授予SQL Server FileTable
- 9. 如何授予数据库中所有表的某些权限?
- 10. 如何向SQL Server 2008实例授予所有用户权限?
- 11. 什么是T-SQL授予对SQL Server数据库中表的读写权限?
- 12. 在SQL Server中创建用户,登录名和授予权限
- 13. BigQuery - 授予读取权限但不授予数据集创建权限
- 14. 如何授予访问权限以更改所有SQL表的权限?
- 15. 授予的权限数据库中的所有对象 - Postgres的
- 16. 授予SQL Server 2005的权限
- 17. SQL Server 2008授予information_schema.columns的权限
- 18. 如何授予用户对所有数据库的只读访问权
- 19. 授予数据库所有操作的权限
- 20. MYSQL:授予权限给所有的用户对数据库
- 21. 授予数据库中所有表的权限SYBASE
- 22. 如何为SQL Server实例中的一个数据库授予sysadmin权限?
- 23. 没有SQL Server Express的登录权限创建数据库
- 24. SQL Server 2008授予选择权限
- 25. 在SQL Server中授予ReadOnly权限(nolock)
- 26. 授予权限创建表 - SQL Server
- 27. SQL Server 2008 Express授予用户权限
- 28. 授予数据库权限的不授予表的访问权限
- 29. TSQL授予读取和写入权限的所有表
- 30. 授予数据库用户权限
我为什么刚才听说了这个sp_msforeachdb?我想我只是尝试用我知道的工具来弄清楚所有的事情。那么,我将它添加到工具箱中。谢谢! – buckbova 2010-06-21 18:25:51
谢谢!这似乎工作。我确实已将该查询的结果复制到了文本板中,并用\ nGo \ n替换了Go \ n – Greg 2010-06-21 18:41:33
@Greg - 很高兴它的工作。你在Management Studio中运行过吗?如果这样,选择“结果到文本”(CTRL + T)选项可能会避免中间步骤的需要。 – 2010-06-21 18:44:09