我正在学习身份验证-用户-角色-模式之间的关系。在我的应用程序中,我使用的是分配为系统管理员(以及公共)服务器角色的 Windows 身份验证。
之后,当我执行时SELECT CURRENT_USER
,我得到dbo
. 但是,我找不到从服务器角色到数据库用户的映射。我还通过创建一个具有公共服务器角色的登录来进行测试。使用此登录名,我在执行时得到了客人SELECT CURRENT_USER
。
那么这个映射是在哪里定义的呢?
我正在学习身份验证-用户-角色-模式之间的关系。在我的应用程序中,我使用的是分配为系统管理员(以及公共)服务器角色的 Windows 身份验证。
之后,当我执行时SELECT CURRENT_USER
,我得到dbo
. 但是,我找不到从服务器角色到数据库用户的映射。我还通过创建一个具有公共服务器角色的登录来进行测试。使用此登录名,我在执行时得到了客人SELECT CURRENT_USER
。
那么这个映射是在哪里定义的呢?
我不确定你在问什么。
您的用户登录名必须具有该sysadmin
角色。在内部,具有该sysadmin
角色的所有用户都将自动模拟该dbo
用户。这就是sysadmin
角色的工作方式。如果您添加另一个用户登录并运行SELECT CURRENT_USER()
,您将获得实际用户名而不是dbo
.
至于定义映射的一般位置,它位于sys.server_principals
和sys.server_role_members
系统目录中。您可以使用此查询来查看映射:
select r.name "role_name", m.name "member_name"
from sys.server_principals r
left join (sys.server_role_members rm
inner join sys.server_principals m
on rm.member_principal_id = m.principal_id)
on r.principal_id = rm.role_principal_id
where r.type = 'R'
order by r.name, m.name
您必须使用存储过程sp_addsrvrolemember
并sp_dropsrvrolemember
实际修改映射。
虽然我不完全确定您的问题,但您可能想查看IS_SRVROLEMEMBER
,例如:
select is_srvrolemember('sysadmin');
select is_srvrolemember('dbcreator');
select is_srvrolemember('bulkadmin');
select is_srvrolemember('diskadmin');
select is_srvrolemember('processadmin');
select is_srvrolemember('serveradmin');
select is_srvrolemember('setupadmin');
select is_srvrolemember('securityadmin');
或者甚至
select is_member('dbo');
select is_member('public');
select is_member('guest');
SQL Server 2008 中有许多安全功能可以帮助您。
我想出了如何检查映射,以及让我感到困惑的部分。首先,检查服务器登录和数据库用户之间映射的查询是这样的:
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.sid = SSP.sid
sid 是所有主体的唯一标识符,包括服务器级别、数据库级别。
其次,让我感到困惑的实际部分。这是因为存在隐式映射,但即使查询也不会显示。让我再次描述一下我的问题:我使用我的 Windows 登录名(我们称之为 MY_W_NAME)作为身份验证模式来登录 SQL Server。之后,当我对一个数据库执行 select CURRENT_USER 时,我得到了 dbo,它是一个数据库用户。我会假设 MY_W_NAME 和 dbo 之间存在显式映射,我想找到它是唯一的自然。我正在使用 SQL Server 管理工作室,我在服务器登录名 MY_W_NAME 的属性窗口中看到,有一个名为“用户映射”的选项卡。所以我期待在这里看到一个映射,结果发现没有。在我运行上面的查询之后,我仍然找不到那里列出的 MY_W_NAME。所以它是如何映射的真的很神秘。
原来这是因为 MY_W_NAME 是服务器角色“sysadmin”,默认情况下,此登录名将映射到所有数据库的所有“dbo”数据库用户。但是此映射不会由查询显示,也不会显示在属性窗口的用户映射选项卡上。一些进一步的实验显示了更多有趣的事实:我实际上可以添加从 MY_W_NAME 到特定数据库的显式映射,例如,从脚本或属性窗口。但是,即使我看到为 MY_W_NAME 创建新数据库用户的执行是成功的,当我对这个数据库运行 select CURRENT_USER 时,我仍然得到 dbo。我想这是因为“系统管理员”确实具有更高的权限。相反,如果我创建了一个具有“公共”服务器角色的服务器登录名,并在此登录名与数据库用户之间添加了一个映射,则会显示此映射。
我必须说,对于 SQL Server 经验有限的普通人来说,这不是一种自然的方式。几天后,终于有人向我指出了这一点。