授予者没有 GRANT 权限 - 问题

Posted

技术标签:

【中文标题】授予者没有 GRANT 权限 - 问题【英文标题】:Grantor does not have GRANT permission - issue 【发布时间】:2014-03-21 09:17:09 【问题描述】:

我在向我创建的服务器级角色授予适当权限时遇到问题。每当该角色的用户尝试向其他用户授予许可时,我都会收到标题中的错误。当我授予角色权限时,我做了一些研究并添加了授予选项,但这没有帮助。我想将我的角色权限保持在执行给定脚本所需的最低水平。

这是我创建角色的方式

CREATE SERVER ROLE [My_Server_Role]
go

GRANT    ALTER ANY LOGIN
        ,ALTER ANY SERVER ROLE
        ,CONNECT SQL
TO [My_Server_Role] 
WITH GRANT OPTION
go

现在我有一个像这样创建的用户(第二个也是同样的方法)

CREATE  LOGIN   JohnSmith
    WITH    PASSWORD = 'MyPassword'

CREATE  USER JohnSmith
FOR     LOGIN JohnSmith

EXEC sp_addsrvrolemember [My_Server_Role], [JohnSmith] 

现在,我的问题是每当 JohmSmith 尝试执行

DENY CONNECT SQL TO [ThatOtherUser] 

我已阅读将WITH GRANT OPTIONS 添加到CREATE ROLES 语句,但它没有帮助。我可以将CONTROL SERVER 添加到MyServerRole 但随后用户获得了过高的权限并且能够共同控制其他数据库

有人可以帮忙吗?也许我把这个想法搞砸了。我的观点是仅授予用户(角色)对一个数据库的权限,而且我不想使用内置服务器和数据库角色

【问题讨论】:

【参考方案1】:

您有两种解决方案:

1) 为角色定义AUTHORIZATION (See here)

CREATE SERVER ROLE role_name [ AUTHORIZATION server_principal ]

角色名称 是要创建的服务器角色的名称。

授权 server_principal 是拥有新服务器角色的登录名。如果未指定登录名,则服务器角色将归执行CREATE SERVER ROLE 的登录名所有。

服务器主体将能够授予该角色。

2) 使用CONTROL ON ROLE

您可以将其添加到GRANTed 权限列表中。查看this document中的数据库角色权限部分:

【讨论】:

【参考方案2】:

来自DENY server permissions:

需要 CONTROL SERVER 权限或安全对象的所有权。如果您使用 AS 子句,则指定的主体必须拥有权限被拒绝的安全对象。

因此,似乎因为您的服务器角色没有CONTROL SERVER,所以他们不能拒绝自己连接。

【讨论】:

以上是关于授予者没有 GRANT 权限 - 问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FLAG_GRANT_READ_URI_PERMISSION 授予对自定义内容提供者的临时访问权限

如何在启用 skip-grant-table 时授予 root 用户所有权限

为啥在我第一次授予用户权限时会创建“GRANT USAGE”?

oracle 授予权限和收回权限 grant和revoke 以及角色的创建 删除

with admin option和with grant option的区别

with admin option和with grant option的用法