我以 sa 身份登录(在我的会话中使用 select suser_name() 仔细检查了它)。
我cards_login_generator
在数据库 [cards] 上创建了一个登录名和同名用户。我想允许该用户创建登录名、用户,并使他们成为db_datareader
和的成员db_datawriter
。
我已经同意ALTER ANY LOGIN/USER
并且它有效。现在是时候了:
grant alter on role::[db_datareader] to cards_login_generator
失败了:
找不到角色“dbo.db_datareader”,因为它不存在或您没有权限。
我已经彻底搜索过,但无法想象此消息的任何原因。该角色是一个(可能是不可删除的?)数据库角色,我是 sa,所以不会出现权限问题。为什么会失败?
Microsoft SQL Server 2017 (RTM-GDR) (KB5014354) - 14.0.2042.3 (X64)
如this answer中所述,修改固定数据库角色中的成员资格要求修改主体是
db_owner
固定数据库角色的成员。这是一个测试平台来展示它是如何工作的。首先,我们将创建一个有权创建其他登录名的登录名,然后将该登录名添加到我们的
[Test]
数据库中,在那里我们将为该登录名创建一个用户,并授予该用户更改用户和角色的权限。接下来,我们将模拟新的登录名并尝试创建一个新的登录名和用户,并将该用户添加到固定的数据库角色中,
db_datareader
并且db_datawriter
:上面的
ALTER ROLE
语句失败,报告这个错误:但是,如果我们在数据库中创建角色
[user_creator_test]
的成员,然后重新运行测试,它会成功:db_owner
[Test]
此查询显示数据库角色成员资格:
结果:
清理:
根据ALTER ROLE文档,为了能够更改固定数据库角色的成员身份,用户还必须是
db_owner
数据库上的成员: