我正在学习authentication-user-role-schema之间的关系。在我的应用程序中,我使用的是Windows身份验证,该身份验证被指定为sysadmin(以及公共)服务器角色。
之后,当我执行SELECT CURRENT_USER
时,我得到dbo
。但是,我找不到从服务器角色到数据库用户的映射。我还通过创建一个服务器角色为public的登录进行测试。使用此登录信息,我在执行SELECT CURRENT_USER
时收到了来宾。
那么这个映射的定义在哪里?
答案 0 :(得分:1)
我不确定你在问什么。
您的用户登录必须具有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
来实际修改映射。
答案 1 :(得分:0)
虽然我不完全确定您的问题,但您可能需要查看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中有许多security functions可以帮助您。
答案 2 :(得分:0)
我想出了如何检查映射,以及让我困惑的部分是什么。首先,检查服务器登录和db用户之间的映射的查询是这样的:
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是所有主体的唯一标识符,包括服务器级别,db级别。
其次,实际的部分让我感到困惑。这是因为存在隐式映射,但即使查询也不会显示。让我再次描述我的问题:我使用我的Windows登录(让我们称之为MY_W_NAME)作为身份验证模式登录到SQL Server。之后,当我对一个数据库执行select CURRENT_USER时,我得到dbo,这是一个数据库用户。我认为MY_W_NAME和dbo之间存在明确的映射,这是唯一的本质,我想找到它。我正在使用SQL Server管理工作室,我在服务器登录MY_W_NAME的属性窗口中看到,有一个名为User Mapping的选项卡。所以我期待在这里看到一个映射,但却发现没有映射。在我运行上述查询后,我仍然无法在那里找到MY_W_NAME。所以它的映射真的很神秘。
原来,这是因为MY_W_NAME属于服务器角色'sysadmin',默认情况下,此登录将映射到所有数据库的所有'dbo'数据库用户。但是查询不会显示此映射,也不会在属性窗口中的用户映射选项卡上显示。一些进一步的实验显示了更多有趣的事实:我实际上可以添加从MY_W_NAME到特定数据库的显式映射,例如,从脚本或属性窗口。但是,即使我看到为MY_W_NAME创建新数据库用户的执行成功,当我运行select CURRENT_USER到此数据库时,我仍然得到dbo。我想这是因为'sysadmin'确实拥有更高的权限。相反,如果我创建了具有“公共”服务器角色的服务器登录,并且我在此登录与数据库用户之间添加了映射,则将显示此映射。
我必须说这对于在SQL Server中经验有限的普通人来说并不是一种自然的方法。几天后,终于有人向我指出了。