2012-11-01 95 views
0

我正在學習authentication-user-role-schema之間的關係。在我的應用程序中,我使用我的Windows身份驗證,它被分配爲sysadmin(以及公共)服務器角色。什麼是SQL Server 2008中服務器角色的默認用戶映射

之後,當我執行SELECT CURRENT_USER,我得到dbo。但是,我找不到從服務器角色到數據庫用戶的映射。我還通過創建一個具有公共服務器角色的登錄進行測試。使用此登錄信息時,我執行SELECT CURRENT_USER時接到了客人。

那麼,這映射得到界定?

回答

0

我想通了,如何檢查的映射,以及什麼是部分困惑我。首先,檢查服務器的登錄名和數據庫用戶之間的映射的查詢是這樣的:

SELECT 
SDP.PRINCIPAL_ID AS [Principal ID], 
SDP.NAME AS [Database UserName], 
SDP.TYPE_DESC AS [Datebase UserType], 
SSP.NAME AS [Server LoginName], 
SSP.TYPE_DESC AS [Server LoginType] 
FROM sys.database_principals SDP 
INNER JOIN sys.server_principals SSP 
ON SDP.sid = SSP.sid 

的SID是所有主體包括服務器級別,數據庫級別的唯一標識符。

其次,這讓我感到困惑它的實際部分。這是因爲存在隱式映射,但即使通過查詢也不會顯示。讓我再次描述我的問題:我使用我的Windows登錄名(我們稱之爲MY_W_NAME)作爲登錄到SQL Server的身份驗證模式。之後,當我執行選擇CURRENT_USER到一個數據庫時,我得到dbo,這是一個數據庫用戶。我只假定MY_W_NAME和dbo之間有一個明確的映射關係,我想找到它。我正在使用SQL Server管理工作室,並且在我的服務器登錄名MY_W_NAME的屬性窗口中看到,有一個名爲「用戶映射」的選項卡。所以我期待在這裏看到一個映射,只是發現沒有。在我運行上面的查詢後,我仍然無法找到列在那裏的MY_W_NAME。所以它如何映射真的很神祕。

原來,這是因爲MY_W_NAME是服務器角色的「系統管理員」,默認情況下此登錄將被映射到所有數據庫中的所有「DBO」數據庫用戶。但是此查詢不會顯示該映射,也不會顯示屬性窗口中的用戶映射選項卡。一些進一步的實驗顯示了更多的關注事實:我實際上可以添加從MY_W_NAME到特定數據庫的明確映射,例如,從腳本或屬性窗口。但是,即使我看到爲MY_W_NAME創建一個新的數據庫用戶的執行是成功的,但是當我將這個數據庫選擇CURRENT_USER運行時,我仍然得到了dbo。我想這是因爲'系統管理員'具有更高的權限。相反,如果我創建了具有「公共」服務器角色的服務器登錄名,並且在此登錄名與數據庫用戶之間添加了映射,則會顯示此映射。

我必須說,這不是一個正常的人在SQL Server有限的經驗的自然方式。幾天後,終於有人向我指出了這一點。

0

雖然我不能完全確定你的問題,你可能想看看IS_SRVROLEMEMBER,例如:

select is_srvrolemember('sysadmin'); 
select is_srvrolemember('dbcreator'); 
select is_srvrolemember('bulkadmin'); 
select is_srvrolemember('diskadmin'); 
select is_srvrolemember('processadmin'); 
select is_srvrolemember('serveradmin'); 
select is_srvrolemember('setupadmin'); 
select is_srvrolemember('securityadmin'); 

甚或

select is_member('dbo'); 
select is_member('public'); 
select is_member('guest'); 

有一堆的security functions SQL Server 2008可能會幫助你。

+0

我很抱歉,但這可能不是我的意思。我想問我如何從登錄時使用我的Windows登錄名獲取'dbo',我認爲它是數據庫用戶'dbo',從我所看到的情況來看,它只分配了'sysadmin'服務器角色。因爲我無法在這兩者之間找到清晰的映射路徑。另外,我對你的第二個劇本感到困惑。我看到函數is_member需要Windows組或SQL Server角色名稱。但是,我無法在我的服務器角色中找到「dbo」和「guest」。我很確定這個功能起作用,所以我必須有一些誤解 – tete

1

我不確定你在問什麼。

你的用戶登錄必須有sysadmin作用。在內部,具有sysadmin角色的所有用戶將自動模擬dbo用戶。這是sysadmin角色的工作原理。如果您添加其他用戶登錄並運行SELECT CURRENT_USER(),您將獲得實際用戶的名稱而不是dbo

就一般定義的映射而言,它位於sys.server_principalssys.server_role_members系統目錄中。您可以使用此查詢來查看映射:

select  r.name "role_name", m.name "member_name" 
from  sys.server_principals r 
left join (sys.server_role_members rm 
      inner join sys.server_principals m 
         on rm.member_principal_id = m.principal_id) 
      on r.principal_id = rm.role_principal_id 
where  r.type = 'R' 
order by r.name, m.name 

必須使用存儲過程sp_addsrvrolemembersp_dropsrvrolemember實際修改的映射。

+0

是的,那正是我想要做的。而令人困惑的部分是sysadmin角色的用戶將不會在我自己的回答中描述的查詢結果中明確顯示。所以我就像「什麼是什麼?爲什麼內部連接不顯示我的(系統管理員)登錄映射到我的查詢dbo,但CURRENT_USER返回它(dbo)?」 – tete

+0

@tete不要將'dbo'用戶帳戶與'db_owner'固定角色混淆。如果您的服務器登錄名是「sysadmin」服務器角色的成員,那麼您將自動映射到'dbo'用戶帳戶,該用戶帳戶是一個隱含訪問權限的內置用戶帳戶,可以對數據庫執行任何操作。這不是一個角色映射。它本質上是用戶模擬。 http://msdn.microsoft.com/en-us/library/bb669065.aspx –

相關問題