sql-server - 如何理解SQL Server中的Principal?

标签 sql-server database-permissions principal

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

令人困惑的部分来自以下三个查询:

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只是数据库用户的标识符,因此它可能恰好与服务器用户的相同) ,然后我有第三个查询,但不明白它是什么意思:

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进行内部连接意味着什么?内连接意味着该列是共同唯一的,对吗?

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

最佳答案

sys.database_principals上的principal_id之间没有对应关系和 sys.server_principals 。首先,它仅被记录为在数据库中是唯一的。其次,它们在整个服务器上是唯一的。并且同一 View 中这些列之间没有记录的关系。

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

因此,使用 principal_id 显示两个 View 之间的联接的查询是错误的。

关于sql-server - 如何理解SQL Server中的Principal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13310473/

相关文章:

c# - 如何从 C# 中的存储过程中获取选定的值?

c# - 使用带有 header 数据的 IAuthorizationPolicy 和 UserNamePasswordValidator 登录?

grails - 如何使用 shiro 在 grails 中显示用户的名字

mysql - 提高特定 MySQL 查询的性能

php - ACL 建模 - 如何管理访问控制列表的 "hierarchy"?

java - session失效后request.getUserPrincipal()仍然不为null

sql - 调度多个相互依赖的 SQL Server 代理作业的做法是什么?

sql-server - 计算一行中 NULL 值的数量

c# - 回滚而不抛出异常?

postgresql - 我如何设置权限,以便所有开发人员都获得对任何其他开发人员创建的对象的所有特权?