PostgreSQL 实现快速删除一个用户
背景
在多租户场景或者其他场景下,很多时候需要主动清理一些用户,本文将介绍PostgreSQL下如何快速删除一个用户(role)。
具体方法
一般情况下直接执行droprolexxx;就可以把这个用户删除。但是很多时候会因为用户有依赖而报错。
权限依赖
postgres=#createroletestwithlogin; CREATEROLE postgres=#grantallondatabasepostgrestotest; GRANT postgres=#droproletest; ERROR:role"test"cannotbedroppedbecausesomeobjectsdependonit DETAIL:privilegesfordatabasepostgres
可以看出,因为我们把数据库postgres的权限赋予了test用户,所以直接删除的时候会报错。面对这种情况,我们需要先将role的权限所有的权限全部revoke掉,如下:
postgres=#revokeallondatabasepostgresfromtest; REVOKE postgres=#droproletest; DROPROLE
注意:需要把该用户在所有数据库具有权限的所有数据库对象的(表,视图,SEQUENCE)权限全部回收,才能删除该用户。
对象依赖
postgres=#createroletestwithlogin; CREATEROLE postgres=#\c-test Youarenowconnectedtodatabase"postgres"asuser"test". postgres=>createtabletest(idint); CREATETABLE postgres=#\c-postgres Youarenowconnectedtodatabase"postgres"asuser"postgres". postgres=#droproletest; ERROR:role"test"cannotbedroppedbecausesomeobjectsdependonit DETAIL:owneroftabletest
可以看出,因为test用户是test表的owner,所以删除的时候报错owneroftabletest。如果不需要保留该对象,则需要先把该依赖对象删除。如果需要保留该对象,则应该在删除之前先把owner赋予别人,如下:
postgres=#altertabletestOWNERTOpostgres; ALTERTABLE postgres=#droproletest; DROPROLE
注意:需要把该用户在所有数据库具有owner权限的所有数据库对象(表,视图,SEQUENCE)删除或者执行alterxxownerto,才能删除该用户。
更牛逼的方法
如果不保留owner的数据库对象
postgres=#REASSIGNOWNEDBYtestTOpostgres; REASSIGNOWNED postgres=#DROPOWNEDBYtest; DROPOWNED postgres=#droproletest; DROPROLE
如果保留owner的数据库对象
postgres=#REASSIGNOWNEDBYtestTOpostgres; REASSIGNOWNED postgres=#droproletest; DROPROLE
注意:REASSIGNOWNED需要执行者所属的role(或者子集)必须包含test和postgres或者是superuser。另外必须所有涉及到的数据库上都执行该以上语句才能删除用户。
补充:PostgreSQL数据库创建/删除
方法1-系统命令
sudosu-postgres#切换到postgres用户(系统用户) createdbweichen#创建数据库 psql#直接访问数据库(默认进入本地postgres数据库) \l--查看数据库列表 :q--退出列表页面 \q--退出客户端 dropdbweichen#删除数据库
方法2-psql命令行
sudo-upostgrespsql#登录客户端 createdatabaseweichen;--创建数据库 createdatabaseszownerpostgres;--创建数据库 selectoid,datnamefrompg_database;--查看数据库列表 dropdatabaseweichen;--删除数据库 dropdatabasesz;--删除数据库
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。