我需要爲服務器上的所有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