我在Windows 7 SP1 64bit上使用PostgreSQL 9.4,在撤销角色时遇到问题。 让我们说我有三个用户:泰勒,米歇尔和超级用户postgres。 作为postgres,我授予角色'utente'使用管理员选项
$(document).ready(function () {
$(".thehide").hide();
$(".datepicker").datepicker({dateFormat: "yy-mm-dd"});
$(".filter_pages").unbind().click(function (e) {
$(this).next(".filter_sub").stop(true).slideToggle();
e.preventDefault();
});
$(document).mouseup(function (e) {
var container = $(".filter_sub");
var calendar = $(".ui-datepicker");
if (!container.is(e.target) && calendar.has(e.target).length === 0 && container.has(e.target).length === 0) {
container.stop(true).slideUp();
}
});
});
然后,作为泰勒,我将角色utente授予米歇尔
--postgres@localhost:5432
GRANT utente TO taylor WITH ADMIN OPTION;
最后,作为postgres,我从taylor撤销了utente的角色
--taylor@localhost:5432
GRANT utente TO michelle;
该角色也应该从米歇尔递归撤销,因为她只接受了泰勒的角色。但事实并非如此,泰勒失去了这个角色,但是米歇尔保留了这个角色。我尝试使用RESTRICT选项运行该命令,该选项应该阻止它被执行,但它不起作用,命令以完全相同的方式执行,taylor失去角色而michelle保留它。 有人可以解释一下吗?
感谢。
答案 0 :(得分:0)
PostgreSQL隐式应用RESTRICT
选项,因此您不必明确指定它。
用户只能撤消该用户直接授予的权限。例如,如果用户A已向用户B授予了具有grant选项的权限,并且用户B已将其授权给用户C,则用户A无法直接从C撤销该权限。相反,用户A可以撤销授予选项来自用户B并使用CASCADE选项,以便从用户C撤销该权限。
所以:
REVOKE utente FROM taylor CASCADE;
但正如你所指出的,这不起作用。看起来它是文档中的错误或错误。
干净利落:
patrick@puny:~$ psql -d pfams
psql (9.4.4)
Type "help" for help.
pfams=# SET SESSION AUTHORIZATION postgres;
SET
pfams=# CREATE ROLE utente NOLOGIN;
CREATE ROLE
pfams=# CREATE ROLE taylor LOGIN;
CREATE ROLE
pfams=# CREATE ROLE michelle LOGIN;
CREATE ROLE
pfams=# GRANT utente TO taylor WITH ADMIN OPTION;
GRANT ROLE
pfams=# SET SESSION AUTHORIZATION taylor;
SET
pfams=> GRANT utente TO michelle;
GRANT ROLE
pfams=# SET SESSION AUTHORIZATION postgres;
SET
pfams=# REVOKE utente FROM taylor CASCADE;
REVOKE ROLE
pfams=# \du taylor
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
taylor | | {}
pfams=# \du michelle
List of roles
Role name | Attributes | Member of
-----------+------------+-----------
michelle | | {utente}
也许要向PostgreSQL错误邮件列表报告。