2012-11-09 55 views
6

這聽起來很愚蠢,但我覺得很困惑:在MSDN中,定義是可以請求SQL Server資源的實體。基本上有三種類型的校長:Windows級校長,SQL Server級校長和數據庫級校長。到目前爲止,沒關係。只是它給了我一個印象,即一個主體的標識符應該與其他主體的標識符不同,不管這種原則是什麼類型(如果這三種類型的所有主體都可以排列在一張表中,它們將具有唯一標識符)如何理解SQL Server中的委託人?

混亂的一部分來自於以下三種查詢:

1)

Select name,principal_id from sys.database_principals 

(注:我在一個數據庫上運行它)

2)

Select name,principal_id from sys.server_principals 

現在我知道第一個返回數據庫用戶主體,而第二個返回服務器用戶主體(糾正我,如果我錯了)。但是爲什麼第一個查詢中的一行可以與第二個查詢中的一行具有相同的principal_id?例如,從數據庫主體一行是:

名:INFORMATION_SCHEMA,principal_id:3

而來自第二查詢中的一個行是

名:系統管理員,principal_id:3

這兩個principal_id是什麼?正如我所提到的,我認爲兩個主體的標識符會有所不同,即使其中一個是數據庫用戶,另一個是服務器用戶(並且從我的名字我認爲principal_id是標識符)。

那麼,如果principal_id對所有主體都不唯一,但在每個查詢的範圍內唯一(第一個查詢的principal_id只是數據庫用戶的標識符,所以它可能恰好與服務器用戶的標識符相同),然後我有一個第三個查詢,不明白這是什麼意思:

3)

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.PRINCIPAL_ID = SSP.PRINCIPAL_ID 

如果兩個principal_id的是他們的範圍內唯一的,這是什麼意思,使內加入兩個principal_id?內部連接意味着這個列是共同唯一的,對嗎?

必須有一些非常基本的東西,我誤解了。感謝您的幫助!

+0

你從哪裏獲得第三個查詢? –

+0

@Damien_The_Unbeliever很多文章都有類似的文章。像這樣的鏈接:http://www.sql-server-performance.com/2009/analyzing-sql-server-permissions/ – tete

+0

並且您是否閱讀了關於該文章的一條評論 - 指出加入principal_id不正確,並且應該使用SID來代替? –

回答

8

principal_id s在sys.database_principalssys.server_principals之間沒有對應關係。首先,它只記錄在數據庫中是唯一的。第二,它們在服務器上是唯一的。在相同視圖中這些列之間沒有文檔化的關係。

事實上,低編號的principal_id很有可能在這兩個視圖中被分配,而他們所涉及的主體是不相關的。

因此,使用principal_id顯示兩個視圖之間的聯接的查詢是錯誤的。

+1

謝謝你的回答。我還有一個問題:我的鏈接中的評論說,查詢的目的是將服務器登錄與其相應的數據庫用戶相匹配。這實際上是我想要做的。但是,如果我運行修改後的查詢(更改了sid上的內部連接),我無法獲取我的登錄名和映射的DB用戶。讓我澄清我想再次做什麼:如果我運行選擇SYSTEM_USER,我有我的Windows登錄,並選擇CURRENT_USER,我得到了dbo。我試圖找到這兩者之間的映射。 – tete

+0

但是,儘管我在server_principal查詢中有我的登錄名,但database_principal中沒有人具有相同的sid。所以我失去了我的蹤跡。我做錯什麼了嗎?例如,我是否有權顯示所有的database_principal?我的登錄名在sysadmin服務器角色 – tete

+0

@tete - 如果你是「sysadmin」的成員,那麼所有奇怪的規則都會引入 - 你在每個數據庫中自動生成'dbo',而'database_principals'中沒有任何條目, 例如。 –