【发布时间】:2012-10-29 21:57:00
【问题描述】:
这听起来很愚蠢,但我发现它真的很混乱:在 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 上进行内部连接意味着什么?内连接意味着该列是共同唯一的,对吧?
一定有一些非常基本的东西我误解了。感谢您提供任何帮助!
【问题讨论】:
-
第三次查询是从哪里获得的?
-
@Damien_The_Unbeliever 许多文章都有类似的文章。喜欢这个链接:sql-server-performance.com/2009/…
-
您是否阅读了该文章中的一条评论 - 指出加入 principal_id 是不正确的,应该使用 SID 来代替?
-
@Damien_The_Unbeliever 该死的,我没有通读,因为我被困在这里。我会继续...感谢您指出
标签: sql-server database-permissions principal