这听起来很蠢,但我觉得它真的很令人困惑:在MSDN中,“principal”的定义是可以请求SQL Server资源的实体。基本上有三种类型的principal:Windows级别的principal、SQL Server级别的principal和数据库级别的principal。到此为止还好。只是这让我有一个印象,即一个principal的标识符应该与其他principal不同,无论这个principal是哪种类型。(如果这三种类型的所有principal都可以排列在一个表中,则它们将具有唯一的标识符)
(注:我在一个数据库上运行它)
2)
现在我知道第一个查询返回数据库用户主体,而第二个查询返回服务器用户主体(如果我错了请纠正)。但为什么第一个查询的一行可以与第二个查询的一行具有相同的principal_id呢?例如,来自数据库主体的一行是:
如果两个 principal_id 只在其范围内唯一,那么在这两个 principal_id 上进行 inner join 是什么意思?内连接意味着这一列是联合唯一的,对吗?
我可能存在一些非常基本的误解。谢谢任何关于此问题的帮助!
令人困惑的部分来自下面这三个查询:
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
而来自第二个查询的一行是
名称:sysadmin,principal_id:3
这两个principal_id是什么?如我所说,我认为两个主体的标识符应该是不同的,即使一个是数据库用户,另一个是服务器用户(从名称中可以看出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 上进行 inner join 是什么意思?内连接意味着这一列是联合唯一的,对吗?
我可能存在一些非常基本的误解。谢谢任何关于此问题的帮助!