【问题标题】:How to understand Principals in SQL Server?如何理解 SQL Server 中的主体?
【发布时间】: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


【解决方案1】:

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

事实上,编号较低的principal_ids 极有可能在两个视图中都被分配,并且它们相关的主体是不相关的。

因此使用principal_id 显示两个视图之间连接的查询是错误的。

【讨论】:

  • 感谢您的回答。我还有一个问题:我链接中的评论说查询的目的是将服务器登录与其相应的数据库用户匹配。这实际上是我想要做的。但是,如果我运行修改后的查询(更改了 sid 上的内部联接),我将无法获得我的登录名,并且它是映射的 DB 用户。让我再次澄清一下我想做什么:如果我运行 select SYSTEM_USER,我得到了我的 windows 登录名,我选择了 CURRENT_USER,我得到了 dbo。我正在尝试找到这两者之间的映射。
  • 但是,虽然我在 server_principal 查询中登录了,但在 database_principal 中没有具有相同 sid 的人。所以我失去了踪迹。我做错什么了吗?例如,我是否有权显示所有 database_principal?我的登录名是 sysadmin 服务器角色
  • @tete - 如果你是sysadmin 的成员,那么各种奇怪的规则就会生效 - 你在每个数据库中自动成为dbo,而database_principals 中没有任何条目,例如。
  • 感谢您的回答。然后我将通过创建一个正常的登录来测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 2010-09-07
  • 2012-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多