2010-06-11 33 views
2

我想對我的sql服務器實例中的所有數據庫的數據庫用戶角色進行查詢。我修改了一個來自sp_helpuser的查詢:SQL Server:查詢服務器中所有數據庫的數據庫用戶角色

select u.name 
     ,case when (r.principal_id is null) then 'public' else r.name end 
     ,l.default_database_name 
     ,u.default_schema_name 
     ,u.principal_id 
from sys.database_principals u 
    left join (sys.database_role_members m join sys.database_principals r on m.role_principal_id = r.principal_id) 
     on m.member_principal_id = u.principal_id 
    left join sys.server_principals l on u.sid = l.sid 
    where u.type <> 'R' 

我該如何修改它以便從所有數據庫中進行查詢? sys.databases和sys.database_principals之間的鏈接是什麼?

回答

3

您可以使用存儲過程sp_msforeachdb

sp_msforeachdb:這是一個非常有用的 系統存儲過程,將 執行傳遞給了 在每個數據庫的SQL 服務器上的任何SQL腳本實例。存儲過程 只是循環遍歷數據庫, 這是很容易編寫,但它可以節省 你不必自己做。

sp_msforeachdb存儲過程中的數據庫名稱和添加列佔位符的數據庫名稱,然後執行該腳本這樣[?]:

EXECUTE sp_msforeachdb 'select ''[?]'' as DatabaseName, 
      u.name 
      ,case when (r.principal_id is null) then ''public'' else r.name end 
      ,l.default_database_name 
      ,u.default_schema_name 
      ,u.principal_id 
    from [?].sys.database_principals u 
     left join ([?].sys.database_role_members m join [?].sys.database_principals r on m.role_principal_id = r.principal_id) 
      on m.member_principal_id = u.principal_id 
     left join [?].sys.server_principals l on u.sid = l.sid 
     where u.type <> ''R''' 

爲了得到這一切在一表你必須在一個數據庫中創建一個表,我們將以master爲例。

master數據庫中創建表

Create Table master.dbo.userPermissionResults 
(
.... 
) 

然後,只需插入語句添加到查詢開始

EXECUTE sp_msforeachdb 'Insert Into master.dbo.userPermissionResults select ''[?]'' as DatabaseName, 
      u.name 
      ,case when (r.principal_id is null) then ''public'' else r.name end 
      ,l.default_database_name 
      ,u.default_schema_name 
      ,u.principal_id 
    from [?].sys.database_principals u 
     left join ([?].sys.database_role_members m join [?].sys.database_principals r on m.role_principal_id = r.principal_id) 
      on m.member_principal_id = u.principal_id 
     left join [?].sys.server_principals l on u.sid = l.sid 
     where u.type <> ''R''' 

必須另行指定爲Insert聲明數據庫名,將嘗試將數據插入到當前數據庫中。

+0

整潔!有沒有一種簡單的方法可以將它放入表格中(或放入同一個網格中)? – atricapilla 2010-06-11 11:27:09

+0

我已經更新了我的答案,詳細介紹瞭如何將數據插入到一個表中。 HTH Barry – codingbadger 2010-06-11 11:41:11

+0

太棒了!謝謝!! – atricapilla 2010-06-11 12:13:31