2008-09-15 65 views
2

我負責一些測試數據庫服務器。從歷史上看,太多的其他人可以訪問他們。他們在SQL Server 2005上運行。我一直在編寫查詢並將它們封裝在腳本中,以便我可以定期對權限進行審計。找出哪些用戶對服務器本身具有管理員權限是沒有問題的,因爲發現誰在登錄時擁有「sysadmin」角色 - 這是後者的單行查詢。如何編寫SQL查詢以查明哪些登錄已被授予Sql Server 2005中的哪些權限?

但如何找出哪些登錄有用戶映射到特定的(或任何)數據庫?我可以找到sys.database_principals和sys.server_principals表。我找到了sys.databases表。我還沒有弄清楚如何找出哪些用戶對數據庫有權限,如果是這樣的話,是什麼。每個Google搜索都會使用「登錄」對話框的「用戶映射」窗格手動啓動人員,而不是使用查詢來執行此操作。有任何想法嗎?

回答

1

以下是如何操作。我最終在MSDN文檔中找到了對sproc的引用。我把它從sproc中拉出來,並將其包裝在實例已知的所有數據庫的循環中。

select DbRole = g.name, MemberName = u.name 
    from @NAME.sys.database_principals u, @NAME.sys.database_principals g, @NAME.sys.database_role_members m 
    where g.principal_id = m.role_principal_id 
    and u.principal_id = m.member_principal_id 
    and g.name in (''db_ddladmin'', ''db_owner'', ''db_securityadmin'') 
    and u.name not in (''dbo'') 
    order by 1, 2 

然後,這會報告擁有DBO的用戶,他們可能不應該這樣做。我已經撤銷了一些他們不需要的用戶的一些管理員權限。感謝大家!

1

select * from Master.dbo.syslogins l inner join sys.sysusers u on l.sid = u.sid 

這會讓你知道用戶映射到單個數據庫中的哪些登錄。

2

查看關於Has_Perms_By_Name的msdn參考文章。我認爲你是例子d,F和G


另一個想法很感興趣......我發射了SQL事件探查器,並點擊了ObjectExplorer->安全 - >用戶。這導致(大約)發出以下查詢。

SELECT * 
FROM 
    sys.database_principals AS u 
    LEFT OUTER JOIN sys.database_permissions AS dp 
    ON dp.grantee_principal_id = u.principal_id and dp.type = N'CO' 
WHERE (u.type in ('U', 'S', 'G', 'C', 'K')) 
ORDER BY [Name] ASC 
+0

大衛,我認爲你在錢上。我明天開始工作時需要測試一下。將更新這個問題。非常感謝! – 2008-09-15 20:42:33

相關問題