7

这听起来很愚蠢,但我发现它真的很混乱:在 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

而第二个查询的一行是

名称:系统管理员,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 上进行内部连接意味着什么?内连接意味着这个列是共同唯一的,对吧?

一定有一些非常基本的东西我误解了。感谢您提供任何帮助!

4

1 回答 1

9

principal_ids onsys.database_principals和之间没有对应关系sys.server_principals。首先,它仅被记录为在数据库中是唯一的。其次,它们在服务器中是独一无二的。并且在同一视图中这些列之间没有记录的关系。

事实上,低编号principal_id的 s 很可能在两个视图中都被分配,并且它们所关联的主体是不相关的。

所以显示两个视图之间连接的查询principal_id是错误的。

于 2012-11-09T15:20:53.837 回答