这听起来很愚蠢但我发现它确实令人困惑:在MSDN中,定义是可以请求SQL Server资源的实体。基本上有三种类型的主体:Windows级主体,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
,而第二个查询中的一行是
name:sysadmin,principal_id:3
这两个principal_id是什么?正如我所提到的,我认为两个主体的标识符会有所不同,即使一个是DB用户而另一个是服务器用户(并且从名称我假设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 :(得分:9)
sys.database_principals
上的principal_id
与sys.server_principals
之间没有对应关系。首先,它只记录在数据库中是唯一的。第二,它们在服务器上是唯一的。并且在相同视图中这些列之间没有记录的关系。
事实上,低编号principal_id
很可能在两个视图中都被分配,并且它们相关的主体是无关的。
因此,使用principal_id
显示两个视图之间的连接的查询是错误的。