PostgreSQL 实现快速删除一个用户

背景

在多租户场景或者其他场景下,很多时候需要主动清理一些用户,本文将介绍PostgreSQL 下如何快速删除一个用户(role)。

具体方法

一般情况下直接执行 drop role xxx; 就可以把这个用户删除。但是很多时候会因为用户有依赖而报错。

权限依赖

postgres=# create role test with login;
CREATE ROLE
postgres=# grant all on database postgres to test;
GRANT
postgres=# drop role test;
ERROR: role "test" cannot be dropped because some objects depend on it
DETAIL: privileges for database postgres

可以看出,因为我们把数据库postgres 的权限赋予了test 用户,所以直接删除的时候会报错。面对这种情况,我们需要先将role 的权限所有的权限全部revoke 掉,如下:

postgres=# revoke all on database postgres from test;
REVOKE
postgres=# drop role test;
DROP ROLE

注意:需要把该用户在所有数据库具有权限的所有数据库对象的(表,视图,SEQUENCE)权限全部回收,才能删除该用户。

对象依赖

postgres=# create role test with login;
CREATE ROLE
postgres=# \c - test
You are now connected to database "postgres" as user "test".
postgres=> create table test (id int);
CREATE TABLE
postgres=# \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# drop role test;
ERROR: role "test" cannot be dropped because some objects depend on it
DETAIL: owner of table test

可以看出,因为test 用户是test 表的owner,所以删除的时候报错owner of table test。如果不需要保留该对象,则需要先把该依赖对象删除。如果需要保留该对象,则应该在删除之前先把owner 赋予别人,如下:

postgres=# alter table test OWNER TO postgres;
ALTER TABLE
postgres=# drop role test;
DROP ROLE

注意:需要把该用户在所有数据库具有owner 权限的所有数据库对象(表,视图,SEQUENCE)删除或者执行alter xx owner to,才能删除该用户。

更牛逼的方法

如果不保留owner 的数据库对象

postgres=# REASSIGN OWNED BY test TO postgres;
REASSIGN OWNED
postgres=# DROP OWNED BY test;
DROP OWNED
postgres=# drop role test;
DROP ROLE

如果保留owner 的数据库对象

postgres=# REASSIGN OWNED BY test TO postgres;
REASSIGN OWNED
postgres=# drop role test;
DROP ROLE

注意:REASSIGN OWNED 需要执行者所属的role (或者子集)必须包含test 和postgres 或者是superuser。另外必须所有涉及到的数据库上都执行该以上语句才能删除用户。

补充:PostgreSQL数据库创建/删除

方法1 - 系统命令

sudo su - postgres #切换到postgres用户(系统用户)
createdb weichen #创建数据库
psql #直接访问数据库(默认进入本地postgres数据库)
\l --查看数据库列表
:q --退出列表页面
\q --退出客户端
dropdb weichen #删除数据库

方法2 - psql命令行

sudo -u postgres psql #登录客户端
create database weichen; --创建数据库
create database sz owner postgres; --创建数据库
select oid,datname from pg_database; --查看数据库列表
drop database weichen; --删除数据库
drop database sz; --删除数据库

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • PostgreSQL报错 解决操作符不存在的问题

    最近才接触到一个用PostgreSQL的项目,然后在开发的过程中发现了这样的一个问题. 错误: 操作符不存在: character = integer 反正还有很多报错的,原因都是类型的转换问题.在mysql中似乎对类型这个概念不是那么敏感,而在PostgreSql中Integer .Long.Date.String 等等之间转换都会存在操作符不存在的报错. 所以在使用非实体进行数据传输的时候,例如Map等等就需要手动设置数据类型. Long orgId = (maps.get("orgId&q

  • Postgresql 赋予用户权限和撤销权限的实例

    1.对数据库授权 postgresql 授权某个数据库的权限给wang 账号 使该账号 只能操作指定DB 不能操作其他DB alter user wang set default_transaction_read_only=on; grant all on database test to wang; grant select on all database test to wang; grant select on all tables in schema public to wang; //

  • postgresql 赋权语句 grant的正确使用说明

    grant select on all tables in schema public to username; 此句是有效的复制语句 PG中有schema的概念, 以下的语句就是不行 网上得来终觉浅,错误比较多,还是要自己试试才行. 补充:postgresql关于访问视图需要的权限 某个用户访问一个视图,这个用户需要具备这个视图的schema的usage和这个视图本身的select权限,如果视图的基表来自其他schema,可能还需要其他schema的usage权限(根据postgresql改造

  • postgresql限制某个用户仅连接某一个数据库的操作

    创建数据库bbb且owner为用户b: postgres9.6@[local]:5432 postgres# create database bbb owner b; CREATE DATABASE Time: 259.099 ms 默认情况下使用用户c也可以连接数据库bbb: postgres9.6@[local]:5432 postgres# \c bbb c You are now connected to database "bbb" as user "c"

  • PostgreSQL 自定义自动类型转换操作(CAST)

    背景 PostgreSQL是一个强类型数据库,因此你输入的变量.常量是什么类型,是强绑定的,例如 在调用操作符时,需要通过操作符边上的数据类型,选择对应的操作符. 在调用函数时,需要根据输入的类型,选择对应的函数. 如果类型不匹配,就会报操作符不存在,或者函数不存在的错误. postgres=# select '1' + '1'; ERROR: operator is not unique: unknown + unknown LINE 1: select '1' + '1'; ^ HINT:

  • PostgreSQL用户、数据库及表的管理、操作与授权方式

    摘要 PostgreSQL的常用命令 1.登录数据库 /* 切换到数据库用户 */ su - postgres /* 登录 */ psql 登录成功显示如下: bash-4.2$ psql psql (9.3.17) Type "help" for help. postgres=> 2.切换数据库 /* 登录指定数据库 */ psql -U user -d dbname /* 列举数据库 */ \l /* 切换数据库 */ \c dbname 3.用户管理 /* 创建用户 */

  • PostgreSQL 实现快速删除一个用户

    背景 在多租户场景或者其他场景下,很多时候需要主动清理一些用户,本文将介绍PostgreSQL 下如何快速删除一个用户(role). 具体方法 一般情况下直接执行 drop role xxx; 就可以把这个用户删除.但是很多时候会因为用户有依赖而报错. 权限依赖 postgres=# create role test with login; CREATE ROLE postgres=# grant all on database postgres to test; GRANT postgres=

  • CentOS系统临时禁止一个用户的方法

    前言 在使用CentOS系统的过程中,如果不想删除用户,只是临时或短期内禁止某个用户登录系统,可以通过下面两种办法实现: 1.只把用户的记录从/etc/passwd文件中去掉,仅保留其主目录和其他文件不变: 2.在/etc/passwd文件(或/etc/shadow)中,关于该用户的passwd域的第一个字符前面加上一个"*"号即可. 注意:这只是禁止某个用户.如果要删除一个用户,需要删除的项包括: 1. /etc/passwd文件中的相关用户记录: 2. /etc/group文件中的

  • 使用userdel命令删除Linux用户的教程详解

    serdel是什么 userdel 是一个底层用于删除用户的工具.在 Debian 上,我们通常会使用 deluser 命令.userdel 会查询系统账户文件,例如 /etc/password 和 /etc/group.那么它会删除所有和用户名相关的条目.在我们删除它之前,用户名必须存在. 如何使用userdel 由于 userdel 会修改系统账户文件,那么我们需要root特权来运行它.不然我们会遇到一个报错信息"只有root权限才能执行这项操作"或者类似的信息.在我们得到特权后,

  • shiro实现单点登录(一个用户同一时刻只能在一个地方登录)

    我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件. shiro.ini [main] # Objects and their properties are defined here, # Such as the securityManager, Realms and anything # else needed to build the SecurityManager authc.loginUrl = /login.jsp authc.successUrl = /w

  • 如何快速搭建一个自己的服务器的详细教程(java环境)

    一.   服务器的购买 1. 我选择的是阿里云的服务器,学生价9.5元一个月,百度直接搜索阿里云,然后点击右上角登录,推荐大家用支付宝扫码登录,方便快捷.阿里云官网的东西比较多,登录后我找了很久也没有找到学生服务器在哪里卖,最后在咨询里找到了这个网址,https://promotion.aliyun.com/ntms/campus2017.html,购买的时候需要进行学生认证,按照他的要求一步步来就好,认证大概需要几个小时.如果你不是学生那就直接购买ecs服务器就好,首页就可以看到ecs服务器的

  • IDEA插件之快速删除Java代码中的注释

    背景 有时,我们需要删除Java源代码中的注释.目前有不少方法,比如: 实现状态机.该方式较为通用,适用于多种语言(取决于状态机支持的注释符号). 正则匹配.该方式容易误判,尤其是容易误删字符串. 利用第三方库.该方式局限性较强,比如不同语言可能有不同的第三方库. 本文针对Java语言,介绍一种利用第三方库的方式,可以方便快速地移除代码中的注释. 原理 这个第三方库叫做JavaParser.它可以分析Java源码,并生成语法分析树(AST),其中注释也属于AST中的节点. 因此核心思路即为: J

  • 用Go+WebSocket快速实现一个chat服务

    前言 在 go-zero 开源之后,非常多的用户询问是否可以支持以及什么时候支持 websocket,终于在 v1.1.6 里面我们从框架层面让websocket 的支持落地了,下面我们就以 chat 作为一个示例来讲解如何用 go-zero 来实现一个 websocket 服务. 整体设计 我们以 zero-example 中的 chat 聊天室为例来一步步一讲解 websocket 的实现,分为如下几个部分: 多客户端接入 消息广播 客户端的及时上线下线 全双工通信[客户端本身是发送端,也是

  • Android快速实现一个财务APP程序详解

    目录 前言 一,系统的技术栈 二,系统界面 三,系统核心代码 前言 昨天有个粉丝朋友也想学开发Web和小程序.安卓,问可以在大学学会吗? 在学校学到的东西真的有限: 在很多的高校,有一些教授是学院派的,他们没有做过多少开发工作,上课就是照本宣科,讲的知识点都是陈年落伍的技术,更别说带学生做项目了. 现在的很多硕博学生帮老师做课件,然后老师上课一顿读. 当然有的老师开发能力也是很强的,他们有开发经验,可以更加全面地理解技术知识点,然后传递给学生,也能拿到一些科研项目,然后带学生实战. 但是,但是,

  • oracle快速删除重复的记录

    正在看的ORACLE教程是:oracle快速删除重复的记录.做项目的时候,一位同事导数据的时候,不小心把一个表中的数据全都搞重了,也就是说,这个表里所有的记录都有一条重复的.这个表的数据是千万级的,而且是生产系统.也就是说,不能把所有的记录都删除,而且必须快速的把重复记录删掉. 对此,总结了一下删除重复记录的方法,以及每种方法的优缺点. 为了陈诉方便,假设表名为Tbl,表中有三列col1,col2,col3,其中col1,col2是主键,并且,col1,col2上加了索引. 1.通过创建临时表

  • MySQL实现快速删除所有表而不删除数据库的方法

    本文实例讲述了MySQL实现快速删除所有表而不删除数据库的方法.分享给大家供大家参考,具体如下: 如果直接使用phpmyadmin操作的话肯定非常简单,勾选数据表->点击删除->点击确定,操作完毕! 这里介绍一下快速删除数据表的SQL命令操作方法. 删除表的命令: drop table 表名; 如果有200张表,执行200次,想想就不想动手了. 下面提供一个使用information_schema库的方案: 复制代码 代码如下: SELECT CONCAT('drop table ',tabl

随机推荐