本次课程主要掌握openGauss的用户和角色管理,使用create user创建的用户与使用create role创建的用户的区别在于,前者可以直接连接登录数据库,而使用create role创建的用户不能直接登录到数据库。必须添加LOGIN权限后,才能登录到数据库管理系统。
理论知识学习:
通过CREATE USER创建的用户,默认具有LOGIN权限。
通过CREATE USER创建用户的同时,系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA。
系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。
语法格式
CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [EXPIRED] | DISABLE };
参数说明:
user_name 用户名称。取值范围:字符串,要符合标识符的命名规范。且最大长度不超过63个字符。
password登录密码。密码规则如下:
密码默认不少于8个字符。
不能与用户名及用户名倒序相同。
至少包含大写字母(A-Z)、小写字母(a-z)、数字(0-9)、非字母数字字符(限定为~!@#$%^&*()-_=+\|[{}];:,<.>/?)四类字符中的三类字符。
密码也可以是符合格式要求的密文字符串,这种情况主要用于用户数据导入场景,不推荐用户直接使用。如果直接使用密文密码,用户需要知道密文密码对应的明文,并且保证明文密码复杂度,数据库不会校验密文密码复杂度,直接使用密文密码的安全性由用户保证。
创建用户时,应当使用双引号或单引号将用户密码括起来。
取值范围:字符串。
实验操作学习:
1.环境准备
创建一个名叫tbs18的表空间和一个名叫mydbs18的数据库:
CREATE TABLESPACE tbs18 RELATIVE LOCATION 'tablespace/tbs181';
CREATE DATABASE mydbs18 WITH TABLESPACE = tbs18;
2.使用create user创建用户
使用create user创建的用户,具有登录权限。
--创建一个名叫user18的数据库用户,其密码为kunpeng@1234,并将数据库mydbs18所有的权限都授予用户user18:
CREATE USER user18 IDENTIFIED BY 'kunpeng@1234';
GRANT ALL ON DATABASE mydbs18 TO user18;
查看系统目前有哪些数据库、有哪些用户:
--用刚刚创建的数据库用户user18登录到数据库mydbs18
gsql -d mydbs18 -U user18 -W kunpeng@1234 -r
3.使用create role创建用户
使用create role命令创建的用户user28,没有登录权限。
--创建一个新的名叫user28的角色,并将数据库mydbs18所有的权限都授予用户user28:
用户user28对数据库mydbs18具有的权限和用户user18一模一样。
CREATE ROLE user28 IDENTIFIED BY 'kunpeng@1234';
GRANT ALL ON DATABASE mydbs18 TO user28;
--查看当前openGauss数据库集群由哪些用户:\du
--使用用户user28尝试登录到数据库mydbs18:
gsql -d mydbs18 -U user28 -W kunpeng@1234 -r
gsql: FATAL: role "user28" is not permitted to login
原因:由于数据库用户user28是使用create role语句创建的,目前还不被允许登录到openGauss数据库管理系统。
4.授予用户user28登录权限后:
授予用户user28登录权限后,可以登录数据库
alter user user28 LOGIN;
--现在我们已经授予了user28用户登录数据库的权限,可以正常登录数据库mydbs18:
gsql -d mydbs18 -U user28 -W kunpeng@1234 -r
删除用户和角色
删除用户,首先需要将用户拥有的数据库对象转移或者删除,回收权限。
-- 授予用户user28数据库超级用户的权限:
ALTER USER user28 SYSADMIN;
--使用用户user28登录到数据库mydbs18,创建表空间tbs181、数据库mydbs18、表test1和表test2:
\c mydbs18 user28
CREATE TABLESPACE tbs181 RELATIVE LOCATION 'tablespace/tbs1811';
CREATE DATABASE mydbs18 WITH TABLESPACE = tbs181;
CREATE TABLE test1(col int);
CREATE TABLE test2(col int);
--执行如下的命令,删除用户user28:
drop user user28;
--要删除用户user28,必须先表空间对象和数据库对象的属主修改为其他的用户(如user18用户),或者干脆将其删除:
alter database mydbs18 owner to user18;
alter tablespace tbs181 owner to user18;
--回收用户user28对mydbs18数据库的权限:
REVOKE ALL ON DATABASE mydbs18 FROM user28;
--在mydbs18中属于用户user28的数据库对象的处理方法可以是:假如该对象还有用,可以将该对象转移给其他用户;假如该对象没有用,可以直接删除掉该对象
--假设表test1已经没有用了,我们可以删除表test1:
\c mydbs18 user28
drop table test1;
--假设表test2还有用将表test2转移给用户user18:
REASSIGN OWNED BY user28 to user18;
\dt
\q
--执行删除用户的操作,可以删除user28用户
gsql -r
drop user user28;
\du
补充说明:DROP USER
功能描述:删除用户,同时会删除同名的schema。
注意事项:须使用CASCADE级联删除依赖用户的对象(除数据库外)。当删除用户的级联对象时,如果级联对象处于锁定状态,则此级联对象无法被删除,直到对象被解锁或锁定级联对象的进程被杀死。
在openGauss中,存在一个配置参数enable_kill_query,此参数在配置文件postgresql.conf中。此参数影响级联删除用户对象的行为:
当参数enable_kill_query为on ,且使用CASCADE模式删除用户时,会自动kill锁定用户级联对象的进程,并删除用户。
当参数enable_kill_query为off,且使用CASCADE模式删除用户时,会等待锁定级联对象的进程结束之后再删除用户。
在数据库中删除用户时,如果依赖用户的对象在其他数据库中或者依赖用户的对象是其他数据库,请用户先手动删除其他数据库中的依赖对象或直接删除依赖数据库,再删除用户。即drop user不支持跨数据库进行级联删除。
如果该用户被DATA SOURCE对象依赖时,无法直接级联删除该用户,需要手动删除对应的DATA SOURCE对象之后再删除该用户。




