创建数据库管理用户:
创建用户
dbadmin=> create user mingadmin;
CREATE USER
赋予role
dbadmin=> grant dbduser,dbadmin,pseudosuperuser to mingadmin;
GRANT ROLE
note
dbduser:运行非dba用户访问database designer使用命令行函数
dbadmin:创建删除用户,角色以及模式;查询系统表;结束用户进程;修改配置文件;但是不能启停数据库。
pseudosuperuser:可以认为几乎可以干所有的事,类似oracle的dba role。
enable role
dbadmin-> \c firstvdb mingadmin --\c db_name username
You are now connected to database "firstvdb" as user "mingadmin".
firstvdb=> set role dbduser,dbadmin,pseudosuperuser;
SET
验证
firstvdb=> show enabled roles;
name | setting
---------------+-----------------------------------
enabled roles | dbduser, dbadmin, pseudosuperuser
(1 row)
创建普通用户,语法跟oracle几乎一样:
create user ming1; --可以不指定密码。
grant test,dbduser to ming1;
create user ming2 identified by 'oracle'; --指定密码
grant test,dbduser to ming2;
alter user ming2 default role test; --指定默认 role
指定密码时要加单引号,区分大小写:
dbadmin=> create user ming3 identified by oracle;
ERROR 4856: Syntax error at or near "oracle" at character 33
LINE 1: create user ming3 identified by oracle;
^
dbadmin=> create user ming3 identified by "oracle";
ERROR 4856: Syntax error at or near ""oracle"" at character 33
LINE 1: create user ming3 identified by "oracle";
下面看一下区别:
ming1用户:
dbadmin=> \c - ming1;
You are now connected as user "ming1".
dbadmin=> show available_roles;
name | setting
-----------------+---------------
available roles | dbduser, test
(1 row)
show available_roles;可以看到当前用户有哪些可用角色;
dbadmin=> show enabled_roles;
name | setting
---------------+---------
enabled roles |
(1 row)
show enabled_roles;可以看到当前用户启用了哪些角色。ming1默认并没有启用任何role;
启用role:
dbadmin=> set role test;
SET
dbadmin=> show enabled_roles;
name | setting
---------------+---------
enabled roles | test
(1 row)
也可以用set role all启用所有的可用角色:
dbadmin=> set role all;
SET
dbadmin=> show enabled_roles;
name | setting
---------------+---------------
enabled roles | dbduser, test
(1 row)
ming2用户:
dbadmin=> \c - ming2;
Password:
You are now connected as user "ming2".
需要输入密码,因为当初identified指定了
dbadmin=> show enabled_roles;
name | setting
---------------+---------
enabled roles | test
(1 row)
连上用户以后,test role默认就启用了。这就是alter user default role的作用。
dbadmin=> select user_name,is_super_user,is_locked,default_roles,all_roles from users;
user_name | is_super_user | is_locked | default_roles | all_roles
-----------+---------------+-----------+--------------------------------------+--------------------------------------
dbadmin | t | f | dbduser*, dbadmin*, pseudosuperuser* | dbduser*, dbadmin*, pseudosuperuser*
mingadmin | f | f | | dbduser, dbadmin, pseudosuperuser
ming1 | f | f | | dbduser, test
ming2 | f | f | test | dbduser, test(4 rows)
is_locked列表名建用户时默认用户是不锁定的。
锁定用户:
dbadmin=> alter user ming1 account lock;
ALTER USER
dbadmin=> select user_name,is_locked,lock_time from users;
user_name | is_locked | lock_time
-----------+-----------+-------------------------------
dbadmin | f |
mingadmin | f |
ming1 | t | 2018-06-08 20:31:57.482408+08
ming2 | f |
(4 rows)
解锁用户:
dbadmin=> alter user ming1 account unlock;
ALTER USER
注意:
如果在建用户时用户名加了双引号,那么大小写敏感
create user "Ming";
那么,只能MING,ming,MIng等都连不上,只有Ming能连上。
创建schema:
创建schema语法
create schema [if not exists] [db_name].schema [authorization user_name]
[if not exists]:可选子句,提示当创建schema时若已存在,系统会有提示。
[db_name]:可选子句,指明当前的数据库名,必须连到这个数据库。这是为了避免schema建错数据库的情况。
[authorization user_name]:可选子句,分配schema的属主;默认是创建schema的用户。
创建schema并创建表:
dbadmin=> create schema mingshuo create table t1(a int);
CREATE SCHEMA
dbadmin=> insert into mingshuo.t1 values(1);
OUTPUT
--------
1
(1 row)
dbadmin=> commit;
COMMIT
dbadmin=> select * from mingshuo.t1;
a
---
1
(1 row)
此时,ming1和ming2都是没有权限看到mingshuo下的t1表的:
dbadmin=> select * from mingshuo.t1;
ERROR 3580: Insufficient privilege: USAGE on SCHEMA 'mingshuo' not granted for current user
查看schema下的表的权限,需要表所在schema的usage权限和表的select权限。
只授予ming1用户select权限:
dbadmin=> grant select on mingshuo.t1 to ming1;
WARNING 5682: USAGE privilege on schema "mingshuo" also needs to be granted to "ming1"
GRANT PRIVILEGE
这里提示usage也需要被赋予。虽然有报错,但是还是被赋予成功了。
ming1此时仍然无法查看表的数据:
dbadmin=> select * from mingshuo.t1;
ERROR 3580: Insufficient privilege: USAGE on SCHEMA 'mingshuo' not granted for current user
只授予ming2用户在schema上的usage权限:
dbadmin=> grant usage on schema mingshuo to ming2;
GRANT PRIVILEGE
ming2此时仍然无法查看表的数据:
dbadmin=> select * from mingshuo.t1;
ERROR 4367: Permission denied for relation t1
补齐权限:
dbadmin=> grant select on mingshuo.t1 to ming2;
GRANT PRIVILEGE
dbadmin=> grant usage on schema mingshuo to ming1;
GRANT PRIVILEGE
两个用户都可以查看:
dbadmin=> select * from mingshuo.t1;
a
---
1
(1 row)
总结一下:
select:schema usage+table select
insert:schema usage+table insert
update:schema usage+table update+where或set关联表的select权限
delete:schema usage+table delete+where或set关联表的select权限
create table:schema create;如果用到了sequence,sequence select+sequence的schema的usage
drop table:schema的属主,或者schema usage
truncate table:表属主或者超级用户
alter table add/drop/rename column:schema usage
alter table add/drop constraint:schema usage
alter table rename:schema usage+schema create
alter table set schema:new schema create+old schema usage
reference:约束与外键源表所在schema的usage;创建外键约束需要参考表的references权限。