Sql server 如何理解SQL Server中的主体?

Sql server 如何理解SQL Server中的主体?,sql-server,database-permissions,principal,Sql Server,Database Permissions,Principal,这听起来很愚蠢,但我发现它确实令人困惑:在MSDN中,定义是可以请求SQL Server资源的实体。基本上有三种类型的主体:Windows级主体、SQL Server级主体和数据库级主体。到目前为止还不错。只是它给我的印象是,一个主体的标识符应该与其他主体的标识符不同,无论该原则是什么类型。(如果这三种类型的主体都可以安排在一个表中,那么它们将具有唯一的标识符) 令人困惑的部分来自以下三个问题: (一) (注意:我在一个数据库上运行它) (二) 现在我知道第一个返回数据库用户主体,而第二个返回服

这听起来很愚蠢,但我发现它确实令人困惑:在MSDN中,定义是可以请求SQL Server资源的实体。基本上有三种类型的主体:Windows级主体、SQL Server级主体和数据库级主体。到目前为止还不错。只是它给我的印象是,一个主体的标识符应该与其他主体的标识符不同,无论该原则是什么类型。(如果这三种类型的主体都可以安排在一个表中,那么它们将具有唯一的标识符)

令人困惑的部分来自以下三个问题:

(一)

(注意:我在一个数据库上运行它)

(二)

现在我知道第一个返回数据库用户主体,而第二个返回服务器用户主体(如果我错了,请纠正我)。但是为什么第一个查询中的一行可以与第二个查询中的一行具有相同的主体id呢?例如,数据库主体中的一行是:

名称:信息模式,主体id:3

而第二个查询中的一行是

名称:系统管理员,负责人id:3

这两个主要身份是什么?正如我提到的,我认为两个主体的标识符是不同的,即使一个是DB用户,另一个是服务器用户(根据名称,我假设主体id是标识符)

好的,如果主体id对于所有主体都不是唯一的,但是在每个查询的范围内都是唯一的(第一个查询中的主体id只是数据库用户的标识符,因此它可能恰好与服务器用户中的主体id相同),那么我就有第三个查询,不明白它是什么意思:

(三)

如果两个主体id仅在其范围内唯一,那么在两个主体id上进行内部联接意味着什么?内部联接表示此列是唯一的,对吗


我一定误解了一些非常基本的东西。谢谢你在这方面的帮助

与上的
主体id
s之间没有对应关系。首先,它只记录在数据库中是唯一的。第二,它们在整个服务器中是唯一的。在相同的视图中,这些列之间没有文档化的关系

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


因此,使用
principal\u id
显示两个视图之间连接的查询是错误的。

第三个查询是从哪里获得的?@Damien\u不信者很多文章都有类似的查询。像这样的链接:你读过那篇文章上的一条评论吗?指出加入principal_id是不正确的,应该使用SIDs吗?@Damien_不信者该死的,我没有通读,因为我被困在这里了。我将继续。。。谢谢你指出,谢谢你的回答。我还有一个问题:我链接中的评论说,查询的目的是将服务器登录与其对应的数据库用户相匹配。而这正是我想要做的。但是,如果我运行修改后的查询(更改了sid上的内部联接),我将无法获取登录名及其映射的DB用户。让我再次澄清我想做什么:如果我运行select SYSTEM_USER,我得到了我的windows登录,我选择了当前_用户,我得到了dbo。我正在尝试查找这两者之间的映射。但是,尽管我在服务器\u主体查询中登录,但在数据库\u主体中没有具有相同sid的用户。所以我失去了踪迹。我做错什么了吗?例如,我是否有显示所有数据库的权限?我的登录名在sysadmin服务器下role@tete-如果您是
系统管理员
的成员,那么各种奇怪的规则就会出现-例如,您在每个数据库中自动执行
dbo
,而在
数据库中没有任何条目。谢谢您的回答。然后,我将通过创建一个普通登录来进行测试
Select name,principal_id from sys.database_principals 
Select name,principal_id from sys.server_principals
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