Sql 撤消用户删除表的权限

Sql 撤消用户删除表的权限,sql,postgresql,privileges,Sql,Postgresql,Privileges,我是PostgreSQL的忠实粉丝,但我不明白它内置于用户管理中的一个方面 我的问题是,我已经设置了pgAdmin,并且将让一些非开发人员手动更新某些特定表中的数据。因此,我创建了一个名为“admin”的新用户,并希望限制该用户的权限 我已尝试通过以下查询删除该用户的所有权限(来自其他用户): 当我在一个名为“crap”的表上从用户admin编写一个简单的SELECT语句时,上面的错误确实导致了以下错误:error:relationship crap的权限被拒绝 但我能对用户管理员做的是如下操作

我是PostgreSQL的忠实粉丝,但我不明白它内置于用户管理中的一个方面

我的问题是,我已经设置了pgAdmin,并且将让一些非开发人员手动更新某些特定表中的数据。因此,我创建了一个名为“admin”的新用户,并希望限制该用户的权限

我已尝试通过以下查询删除该用户的所有权限(来自其他用户):

当我在一个名为“crap”的表上从用户admin编写一个简单的SELECT语句时,上面的错误确实导致了以下错误:
error:relationship crap的权限被拒绝

但我能对用户管理员做的是如下操作,到目前为止,用户管理员不应该拥有任何权限:
DROP TABLE crap哪个有效


我真的对此感到惊讶。此用户不是Postgres超级用户。我如何才能删除此权限以删除特定用户的表?

您在权限层次结构中只差一级

REVOKE ALL PRIVILEGES FROM SCHEMA public FROM <role_name>;

在权限的层次结构中,您只差一级

REVOKE ALL PRIVILEGES FROM SCHEMA public FROM <role_name>;

从:
中,只有表所有者、架构所有者和超级用户可以删除表。
那么它是谁的表呢?谢谢您的评论<代码>从pg_表中选择*,其中tablename='crap'
显示本例中的用户“admin”不是所有者。从:
中,只有表所有者、架构所有者和超级用户可以删除表。
那么它是谁的表呢?谢谢您的评论<代码>从pg_表中选择*,其中tablename='crap'显示本例中的用户“admin”不是所有者。Thx!我需要用户能够选择,但不能删除。因此,删除用户不是一个选项。正如您所提到的,我尝试了撤销特权(应该是开着的,但我猜不是从):``撤销数据库价格的所有特权\u从管理员处获得的产品;从管理员处撤消架构公共上的所有权限;```但是这个用户“admin”仍然能够删除该表。。有什么想法吗?我增加了另一个选择:一个非常受欢迎的活动!事件触发器确实可以实现我想要做的事情。我在另一个Stackoverflow线程中看到了一些东西,并试图沿着这条路线走下去。不幸的是,我正在Google Cloud SQL上运行我的PSQL实例,它们不允许用户拥有此类系统触发器所需的超级用户角色。Thx!我需要用户能够选择,但不能删除。因此,删除用户不是一个选项。正如您所提到的,我尝试了撤销特权(应该是开着的,但我猜不是从):``撤销数据库价格的所有特权\u从管理员处获得的产品;从管理员处撤消架构公共上的所有权限;```但是这个用户“admin”仍然能够删除该表。。有什么想法吗?我增加了另一个选择:一个非常受欢迎的活动!事件触发器确实可以实现我想要做的事情。我在另一个Stackoverflow线程中看到了一些东西,并试图沿着这条路线走下去。不幸的是,我正在Google Cloud SQL上运行我的PSQL实例,它们不允许用户拥有此类系统触发器所需的超级用户角色。
REVOKE ALL PRIVILEGES FROM DATABASE <database_name> FROM <role_name>;
ALTER ROLE <role_name> SET NOLOGIN;
CREATE OR REPLACE FUNCTION no_admin_drop()
  RETURNS event_trigger LANGUAGE plpgsql AS $$
BEGIN
  IF CURRENT_USER = 'admin'::regrole THEN
    RAISE EXCEPTION 'command is disabled';
  END IF;
END;
$$;

CREATE EVENT TRIGGER no_admin_drop ON sql_drop
   EXECUTE FUNCTION no_admin_drop();