2012-12-16 38 views
0

所以,我一直在冥思苦想,我在我的好友的網站上找到的代碼:「循環」通過與sp_MSforeachdb數據庫,並返回1點的數據集

8 Steps to Moving Database Logins

我想要生成的數據庫級安全性,角色和顯式權限語句,所以我不會一遍又一遍地複製和粘貼,以便它們可以運行在服務器上的所有數據庫(當然減去tempdb)。

Declare @FullStatement varchar(MAX) 
Set @FullStatement = ' use [?]; SELECT dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500)) AS TSQLScript 
FROM sys.database_permissions AS dp 
INNER JOIN sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id) 
WHERE dp.major_id = 0 
and dpl.name not like ''##%'' -- excluds PBM accounts 
and dpl.name not in (''dbo'', ''sa'', ''public'') 
ORDER BY dp.permission_name ASC, dp.state_desc ASC' 

Exec sp_MSforeachdb @FullStatement 

我如何修改我有什麼,它按原樣工作,但不方便,使用表變量,臨時表,等等等等所有語句都在一個數據集?

回答

4

David,

這是你想要的嗎?

CREATE TABLE tempdb.dbo.Results (c1 VARCHAR(8000)) 

Declare @FullStatement varchar(MAX) 
Set @FullStatement = 'SELECT ''use [?]''; SELECT dp.state_desc + N'' '' + dp.permission_name + N'' TO '' + cast(QUOTENAME(dpl.name COLLATE DATABASE_DEFAULT) as nvarchar(500)) AS TSQLScript 
FROM [?].sys.database_permissions AS dp 
INNER JOIN [?].sys.database_principals AS dpl ON (dp.grantee_principal_id = dpl.principal_id) 
WHERE dp.major_id = 0 
and dpl.name not like ''##%'' -- excluds PBM accounts 
and dpl.name not in (''dbo'', ''sa'', ''public'') 
ORDER BY dp.permission_name ASC, dp.state_desc ASC' 

INSERT INTO tempdb.dbo.Results Exec sp_MSforeachdb @FullStatement 

select * FROM tempdb.dbo.Results 
+0

這是有效的。我將嘗試添加另外兩個數據庫類別。我不敢相信這很簡單。我嘗試了一些接近但卻不斷出錯的東西。 – DavidStein

+1

很酷。我的不好,我認爲你需要把每個數據庫的燙髮放回去。那爲什麼我添加了使用語句刪除SELECT''使用[?]'';從@FullStatement初始化開始。 – Norman

+0

對不起,正常,當我意識到時,我刪除並重新輸入我的評論。你是對的。我只留下使用陳述。 – DavidStein

0

有多種方法可以完成此項工作。你可以使用powershell循環遍歷所有數據庫,並將結果放入Excel中。納爾遜先生在他的PowerShell SQL大學系列中有這個。對不起,會爲你拉鍊接,但我在機場的手機上打字。

+0

呃,我寧願不使用Powershell。有沒有辦法將生成的語句加載到表變量或臨時表中? – DavidStein

0

爲什麼你腳本化數據庫用戶和權限?它們在數據庫中,並且在遷移數據庫時仍然存在。除非從頭開始重新創建數據庫,否則不需要這麼做。