vertica数据库-创建用户,schmea以及权限管理

创建数据库管理用户:

创建用户
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权限。


请使用浏览器的分享功能分享到微信等