2010-06-21 85 views

回答

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_MSforeachdbas here或亞倫Bertrand的改進版本here

如果您沒有看到所有的字符,當你運行它,打開查詢選項的文本,並檢查「設置每列中顯示的最大字符數「。確保將其設置爲足以顯示所有字符的值。

+2

我爲什麼剛纔聽說了這個sp_msforeachdb?我想我只是嘗試用我知道的工具來弄清楚所有的事情。那麼,我將它添加到工具箱中。謝謝! – buckbova 2010-06-21 18:25:51

+0

謝謝!這似乎工作。我確實已將該查詢的結果複製到了文本板中,並用\ nGo \ n替換了Go \ n – Greg 2010-06-21 18:41:33

+1

@Greg - 很高興它的工作。你在Management Studio中運行過嗎?如果這樣,選擇「結果到文本」(CTRL + T)選項可能會避免中間步驟的需要。 – 2010-06-21 18:44:09

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 
+0

它說它成功完成,但我沒有看到任何更改。用戶映射區域沒有改變。我爲輸入的登錄名不會以任何數據庫中的用戶身份出現。有任何想法嗎? – Greg 2010-06-21 18:26:16

+0

@Greg - 您可能想要將Try-Catch塊註釋掉以查看正在拋出的錯誤。 – Thomas 2010-06-21 19:10:59

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

我不得不稍微調整馬丁·史密斯的回答是:

  1. 的空格和換行導致不是所有的文字被正確地產生
  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

相關問題