0

我正在学习身份验证-用户-角色-模式之间的关系。在我的应用程序中,我使用的是分配为系统管理员(以及公共)服务器角色的 Windows 身份验证。

之后,当我执行时SELECT CURRENT_USER,我得到dbo. 但是,我找不到从服务器角色到数据库用户的映射。我还通过创建一个具有公共服务器角色的登录来进行测试。使用此登录名,我在执行时得到了客人SELECT CURRENT_USER

那么这个映射是在哪里定义的呢?

4

3 回答 3

1

我不确定你在问什么。

您的用户登录名必须具有该sysadmin角色。在内部,具有该sysadmin角色的所有用户都将自动模拟该dbo用户。这就是sysadmin角色的工作方式。如果您添加另一个用户登录并运行SELECT CURRENT_USER(),您将获得实际用户名而不是dbo.

至于定义映射的一般位置,它位于sys.server_principalssys.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_addsrvrolemembersp_dropsrvrolemember实际修改映射。

于 2012-11-12T14:40:51.970 回答
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 中有许多安全功能可以帮助您。

于 2012-11-01T21:16:40.123 回答
0

我想出了如何检查映射,以及让我感到困惑的部分。首先,检查服务器登录和数据库用户之间映射的查询是这样的:

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 经验有限的普通人来说,这不是一种自然的方式。几天后,终于有人向我指出了这一点。

于 2012-11-12T10:30:54.230 回答