关于删除用户
删除用户需要有CREATEROLE 特权。如果一个用户的对象在任何数据库中被引用,它就不能被删除,如果尝试删除将会抛出一个错误。 删除用户时,KingbaseES数据库会从数据字典中删除用户相关信息。
终止用户会话
当数据库中还有用户连接的会话时,则无法删除此用户。必须先终止用户会话或者用户可以退出会话,然后才能删除用户。如果需要强制终止会话,可以使用以下步骤:
查询动态会话视图 sys_stat_activity ,找到用户的会话 PID。
例如,查询test用户的会话:
SELECT datname,pid FROM sys_stat_activity WHERE datname='test';
datname |pid |
--------+-----+
test |1336 |
使用系统函数 SYS_TERMINATE_BACKEND 强行终止test用户会话:
call sys_terminate_backend(‘1336’);
用户与数据库断开连接后,就可以使用 DROP USER 语句删除该用户。
删除用户对象
如果用户的对象还存在引用关系,被其他对象依赖,需要删除依赖对象后才能删除用户。
DROP OWNED 常常被用来为移除一个或者多个用户做准备。因为DROP OWNED 只影响当前数据库中的对象,通常需要在包含将被删除用户所拥有的对象的每一个数据库中都执行这个命令。使用CASCADE 选项可能导致这个命令递归去删除由其他用户所拥有的对象。REASSIGN OWNED 命令是另一种选择,它可以把一个或多个用户所拥有的所有数据库对象重新授予给其他用户。不过,REASSIGN OWNED 不处理其他对象的特权。例如,删除test用户下的对象:
DROP OWNED BY test CASCADE;