GBase8a 数据库用户管理
1.用户管理
1.1.创建新用户
操作场景
创建新的 GBase 8a MPP Cluster 数据库用户账号。
前提条件
执行此操作的用户必须有全局 CREATE USER 权限。
语法格式
使用 CREATE USER 语句创建新的 GBase 8a MPP Cluster 数据库用户帐号,创建语 法如下:
CREATE USER user [IDENTIFIED BY [PASSWORD] [password]]
表 1.1-1 参数说明
| 参数名称 | 说明 |
|---|---|
| USER user | 指定要创建的帐号名称。user 支持如下几种方式的书写: 1.任何主机:user@'%' 2.本机:user@'localhost' 3.网段:user@'192.168.0.0'\4. ip 地址:user@'192.168.10.6' 5.与 user@'%'等价:user \6. user 长度支持 128 字符 |
| [IDENTIFIED BY [PASSWORD] [password]] | 通过可选择的 IDENTIFIED BY 语句可以给帐号赋予一个密 码。特别注意的是,密码设置为纯文本格式时可以省略 PASSWORD 关键字。password 是帐号密码 |
示例
说明
对每一个未赋权的帐号,初始时只有登录数据库的权限。
示例 1
创建 admin 用户,密码为admin.
gbase> CREATE USER admin IDENTIFIED BY 'admin';
Query OK, 0 rows affected
gbase> EXIT
Bye
$ gccli -uadmin –padmin
GBase client 9.5.3.22.126635. Copyright (c) 2004-2022, GBase. All Rights Reserved.
All Rights
示例 2
使用超级用户 root 登录,创建一个用户 user1。
$ gccli -uroot -p
Enter password:
GBase client 9.5.3.22.126635. Copyright (c) 2004-2022, GBase. All Rights Reserved.
gbase> CREATE USER user1;
Query OK, 0 rows affected
1.2.修改用户名
操作场景
重命名已经存在的 GBase 8a MPP Cluster 用户。
前提条件
修改用户名必须具有全局 CREATE USER 权限。
语法格式
使用 RENAME USER 语句修改用户名称,语法格式如下:
RENAME USER old_user TO new_user
说明
修改用户名称后,权限保留不变。
示例
gbase> RENAME USER user1 to user2;
Query OK, 0 rows affecte
1.3.删除用户
操作场景
删除已经存在的 GBase 8a MPP Cluster 用户。
前提条件
删除用户信息必须具有全局 CREATE USER 权限。
语法格式
使用 DROP USER 语句删除用户,语法格式如下:
DROP USER user;
说明
DROP USER 不会自动关闭任何打开的用户会话。
当存在使用 此用户打开的会话时,删除此用户并不会影响这些已打开会话的访问权限,直到会话关闭。
示例
删除 admin 用户。
gbase> DROP USER admin;
Query OK, 0 rows affected
1.4.修改用户密码
语法格式
使用 SET PASSWORD 修改用户密码,语法格式如下:
SET PASSWORD [FOR user] = PASSWORD('newpassword')
表 1.4-1 参数说明
| 参数名称 | 说明 |
|---|---|
| FOR user | 指定要修改密码的帐户名称,如果省略,表示修改当前 登录集群帐户的密码。 |
| PASSWORD('newpassword') | 指定帐户的新密码。 |
示例
示例 1
为当前登录集群的帐户设置密码。
$ gccli –uroot
GBase client 9.5.3.22.126635. Copyright (c) 2004-2020, GBase.All Rights Reserved
gbase> SET PASSWORD = PASSWORD('admin');
Query OK, 0 rows affected
gbase> EXIT
Bye
使用新密码重新登录数据库:
$ gccli -uroot -p
Enter password:
GBase client 9.5.3.22.126635. Copyright (c) 2004-2020, GBase. All Rights Reserved.
示例 2
为指定的登录集群的用户设置密码。
$ gccli -uroot --nice_time_format -p
Enter password:
GBase client 9.5.3.22.126635. Copyright (c) 2004-2020, GBase. All Rights Reserved.
gbase> SET PASSWORD FOR admin = PASSWORD('adminnew');
Query OK, 0 rows affected
gbase> EXIT
Bye
$ gccli -uadmin --nice_time_format -p
Enter password:
GBase client 9.5.3.22.126635. Copyright (c) 2004-2020, GBase. Reserved.
All Rights
2.权限管理
GRANT 和 REVOKE 语句使用
操作场景
GRANT 和 REVOKE 语句允许系统管理员处理用户权限的赋予与收回。
前提条件
要使用 GRANT 或 REVOKE,用户必须拥有 GRANT OPTION 权限,可以授予或收 回用户权限。
语法格式
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user IDENTIFIED BY [[PASSWORD] [password]]
[WITH with_option ...] object_type:
TABLE | FUNCTION | PROCEDURE priv_level:
* | *.* | database_name.* |database_name.table_name | table_name | database_name.routine_nameREVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user
说明
对于 GRANT 和 REVOKE 语句,priv_level 可以授予不同级别的权限:
全局级(Global level) :全局权限应用到给定服务器的所有数据库上。这些权限存储在
gbase.user表中。只可以通过 GRANT ALL ON ..*和 REVOKE ALL ON ..*授予和收回全局权限;数据库级(Database level) :数据库权限应用于给定数据库的所有对象 上。这些权限存储在
gbase.db和gbase.host表中。只可以通过 GRANT ALL ON vc_name.db_name...和 REVOKE ALL ON vcname.db_name.授予和收 回数据库权限;表级(Table level) :表权限应用于给定表的所有列。这些权限存储在
gbase.tables_priv表 中 。 只可以通过 GRANT ALL ON vcname.db_name.tbl_name 和 REVOKE ALL ON vcname.db_name.tbl_name 授予和收回表权限;列级(column level) :列权限应用于表中的指定列。这些权限存储在
gbase.tables_priv表中。只可以通过 GRANT SELECT,INSERT,UPDATE (column) ON vcname.db_name.tb1_name 和 REVOKE SELECT(column) ON vcname.db_name.tb1_name 授予和收回列权限。
示例
示例 1:为用户 admin 赋予 t 表中 a 列的 select 权限。
gbase> CREATE TABLE t(a int,b varchar(40));
Query OK, 0 rows affected
gbase> INSERT INTO t VALUES (1,'test'),(2,'share');
Query OK, 2 rows affected
Records: 2 Duplicates: 0 Warnings: 0
gbase> GRANT SELECT(a) ON test.t TO admin;
Query OK, 0 rows affected
gbase> SELECT * FROM gbase.tables_priv;
+------+------+-------+----------+-------------------+---------------------+----------+-------------+
| Host | Db | User |Table_name| Grantor | Timestamp |Table_priv| Column_priv |
+------+------+-------+----------+-------------------+---------------------+----------+-------------+
| % | test | admin | t |root@192.168.10.115| 2013-10-18 14:52:33 | | Select |
+------+------+-------+----------+-------------------+---------------------+----------+-------------+
示例 2:收回 t 表中列 a 的 SELECT 权限。
gbase> REVOKE SELECT(a) ON test.t FROM admin;
Query OK, 0 rows affected
gbase> SELECT * FROM gbase.tables_priv;
Empty set
注意:
对用户赋予某指定权限后,若该对象被删除,而用户的权限未被回收,则新建同名对象后,用户即拥有该对象的权限。
权限级别
数据库权限分为:
数据库对象操作类权限;
数据操作类权限;
存储过程和自定义函数执行权限;
数据查看类权限;
数据库(包含用户管理)管理;
下表是 GRANT 和 REVOKE 中的权限级别,语法格式中 priv_type 指定为下列任一 种。
表 2-1 参数说明
| 权限 | 意义 |
|---|---|
| ALL [PRIVILEGES] | 设置除 GRANT OPTION 之外的所有简单权限 |
| ALTER | 允许使用 ALTER TABLE |
| ALTER ROUTINE | 更改或取消已存储的子程序 |
| CREATE | 允许使用 CREATE TABLE |
| CREATE ROUTINE | 创建已存储的子程序 |
| CREATE TEMPORARY TABLE | 允许使用 CREATE TEMPORARY TABLE |
| CREATE USER | 允许使用 CREATE USER, DROP USER, RENAME USER 和 REVOKE ALL PRIVILEGES |
| CREATE VIEW | 允许使用 CREATE VIEW |
| DELETE | 允许使用 DELETE |
| DROP | 允许使用 DROP TABLE |
| EXECUTE | 允许用户运行已存储的子程序 |
| FILE | 允许使用 SELECT...FROM TABLE_NAME INTO OUTFILE、LOAD DATA 等 |
| GRANT OPTION | 允许授予权限 |
| INDEX | 允许使用 CREATE INDEX 和 DROP INDEX |
| INSERT | 允许使用 INSERT |
| PROCESS | 允许使用 SHOW FULL PROCESSLISTS |
| RELOAD | 允许使用 FLUSH |
| SELECT | 允许使用 SELECT |
| SHOW DATABASES | SHOW DATABASES 显示所有数据库 |
| SHOW VIEW | 允许使用 SHOW CREATE VIEW |
| SHUTDOWN | 允许使用 gbaseadmin shutdown |
| SUPER | 允许使用 KILL 和 SET GLOBAL 语句 |
| UPDATE | 允许使用 UPDATE |
| USAGE | 仅仅用于连接登录数据库,主要用来设置 with option 部分 |
| EVENT | 创建、修改、删除 EVENT 的权限 |
3.示例说明
前提条件
创建新用户时,执行此操作的用户必须有全局 CREATE USER 权限(建议使用dba用户),对用户赋权时,对应库名要存在。
库存在
库不存在
库名
创建用户
数据库
赋权库
新建库
用户验证权限
新用户授权-流程图
示例说明:
使用dba用户登录数据库,并创建新库分别为:test_dmc、test_etl、test_crm;
创建新用户test_dmc,密码为‘test_dmc’;
将test_dmc、test_etl、test_crm,赋权给test_dmc用户;
test_dmc用户权限设定,对test_dmc库
所有权限,对test_etl库只能select权限,对test_crm只有create table、select、insert权限;查看test_dmc用户权限,并时进行验证;
收回权限test_dmc,并删除test_dmc用户;
步骤1:dba用户登录
使用gbase用户登录数据库;
[gbase@mpp953 ~]$ gccli -uroot -pgbase
GBase client 9.5.3.22.126635. Copyright (c) 2004-2022, GBase. All Rights Reserved.
步骤2:创建新库
**创建新库分别为,test_dmc、test_etl、test_crm;**gbase> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| gbase |
| gctmpdb |
| gclusterdb |
| testdb |
+--------------------+
6 rows in set (Elapsed: 00:00:00.00)
对用户赋权限时,对应库名要存在,反之,使用CREATE DATABASE *databasename新建库.
gbase> CREATE DATABASE test_dmc;
Query OK, 1 row affected (Elapsed: 00:00:00.02)
gbase> CREATE DATABASE test_etl;
Query OK, 1 row affected (Elapsed: 00:00:00.00)
gbase> CREATE DATABASE test_crm;
Query OK, 1 row affected (Elapsed: 00:00:00.01)
gbase> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| gbase |
| gctmpdb |
| gclusterdb |
| test_crm |
| test_dmc |
| test_etl |
| testdb |
+--------------------+
9 rows in set (Elapsed: 00:00:00.00)
步骤3:创建新用户
创建新用户test_dmc,密码为‘test_dmc’;
gbase> CREATE USER test_dmc IDENTIFIED BY 'test_dmc';
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
步骤4:用户赋权
将test_dmc、test_etl、test_crm,赋权给test_dmc用户;
将test_dmc库,test_dmc用户,具有test_dmc库
所有权限;对test_etl库,test_dmc用户,具有
select权限;对test_crm库,test_dmc用户,具有
create table、select、insert权限;
-- 使用 all 参数,将test_dmc库所有权限,赋权给test_dmc用户;
gbase> GRANT ALL PRIVILEGES ON test_dmc.* TO test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> SHOW GRANTS FOR test_dmc;
+-----------------------------------------------------------------------------------------------+
| Grants for test_dmc@% |
+-----------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'test_dmc'@'%' IDENTIFIED BY PASSWORD '*4D13C9D8FFE2F7628D9DE333C27B56DCCE7F9502' |
| GRANT ALL PRIVILEGES ON "vc00001"."test_dmc".* TO 'test_dmc'@'%' |
+-----------------------------------------------------------------------------------------------+
2 rows in set (Elapsed: 00:00:00.00)--text-color: #202124;-- 使用 select 参数,将test_dmc库所有权限,赋权给test_dmc用户;
gbase> GRANT SELECT ON test_etl.* TO test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> SHOW GRANTS FOR test_dmc;
+------------------------------------------------------------------------------------------------+
| Grants for test_dmc@% |
+------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'test_dmc'@'%' IDENTIFIED BY PASSWORD '*4D13C9D8FFE2F7628D9DE333C27B56DCCE7F9502' |
| GRANT ALL PRIVILEGES ON "vc00001"."test_dmc".* TO 'test_dmc'@'%' |
| GRANT SELECT ON "vc00001"."test_etl".* TO 'test_dmc'@'%' |
+------------------------------------------------------------------------------------------------+
3 rows in set (Elapsed: 00:00:00.00)
-- 对test_crm只有create、select、insert权限;
gbase> GRANT create,select,insert ON test_crm.* TO test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> SHOW GRANTS FOR test_dmc;
+------------------------------------------------------------------------------------------------+
| Grants for test_dmc@% |
+------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'test_dmc'@'%' IDENTIFIED BY PASSWORD '*4D13C9D8FFE2F7628D9DE333C27B56DCCE7F9502' |
| GRANT ALL PRIVILEGES ON "vc00001"."test_dmc".* TO 'test_dmc'@'%' |
| GRANT SELECT ON "vc00001"."test_etl".* TO 'test_dmc'@'%' |
| GRANT SELECT, INSERT, CREATE ON "vc00001"."test_crm".* TO 'test_dmc'@'%' |
+------------------------------------------------------------------------------------------------+
4 rows in set (Elapsed: 00:00:00.00)
步骤5:验证用户权限
查看test_dmc用户权限,并时进行验证;
gbase> SHOW GRANTS FOR test_dmc;
+-----------------------------------------------------------------------------------------------+| Grants for test_dmc@% |
+------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'test_dmc'@'%' IDENTIFIED BY PASSWORD '*4D13C9D8FFE2F7628D9DE333C27B56DCCE7F9502' |
| GRANT ALL PRIVILEGES ON "vc00001"."test_dmc".* TO 'test_dmc'@'%' |
| GRANT SELECT ON "vc00001"."test_etl".* TO 'test_dmc'@'%' |
| GRANT SELECT, INSERT, CREATE ON "vc00001"."test_crm".* TO 'test_dmc'@'%' |
+------------------------------------------------------------------------------------------------+
4 rows in set (Elapsed: 00:00:00.00)
使用test_dmc用户登录,密码为'test_dmc';
[gbase@mpp953 ~]$ gccli -utest_dmc -ptest_dmc
GBase client 9.5.3.22.126635. Copyright (c) 2004-2022, GBase. All Rights Reserved.
gbase> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| performance_schema |
| test_crm |
| test_dmc |
| test_etl |
+--------------------+
5 rows in set (Elapsed: 00:00:00.17)
gbase> use test_crm;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> use test_etl;
Query OK, 0 rows affected (Elapsed: 00:00:00.04)
gbase> use test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
将test_dmc库所有权限,赋权给test_dmc用户;
gbase> use test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.19)
gbase> create table t1 (vid int);
Query OK, 0 rows affected (Elapsed: 00:00:00.03)
gbase> insert into t1 values (1);
Query OK, 1 row affected (Elapsed: 00:00:00.08)
gbase> insert into t1 values (2);
Query OK, 1 row affected (Elapsed: 00:00:00.18)
gbase> insert into t1 values (3);
Query OK, 1 row affected (Elapsed: 00:00:00.06)
gbase> select * from t1;
+------+
| vid |
+------+
| 1 |
| 2 |
| 3 |
+------+
3 rows in set (Elapsed: 00:00:00.00)
gbase> delete from t1 where vid = 1;
Query OK, 1 row affected (Elapsed: 00:00:00.04)
gbase> select * from t1;
+------+
| vid |
+------+
| 2 |
| 3 |
+------+
2 rows in set (Elapsed: 00:00:00.01)
gbase> show tables;
+--------------------+
| Tables_in_test_dmc |
+--------------------+
| t1 |
+--------------------+
1 row in set (Elapsed: 00:00:00.11)
gbase> drop table t1;
Query OK, 0 rows affected (Elapsed: 00:00:00.03)
gbase> DELIMITER //
gbase> CREATE PROCEDURE dodeclare (p1 INT)
-> BEGIN
-> DECLARE intX INT;
-> SET intX = 0;
-> REPEAT SET intX = intX + 1; UNTIL intX > p1 END REPEAT; SELECT intX;
-> END //
Query OK, 0 rows affected (Elapsed: 00:00:00.19)
gbase> DELIMITER ;
gbase> CALL dodeclare(1000);
+------+
| intX |
+------+
| 1001 |
+------+
1 row in set (Elapsed: 00:00:00.00)
gbase> DROP PROCEDURE IF EXISTS dodeclare;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
对test_etl库只能select权限;
gbase> use test_etl;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> select * from t2;
+------+
| vid |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+------+
6 rows in set (Elapsed: 00:00:00.01)
gbase> create table t4 (vid int);
ERROR 1142 (42000): CREATE command denied to user 'test_dmc'@'localhost' for table 't4'
gbase> insert into t2 values (7);
ERROR 1142 (42000): INSERT command denied to user 'test_dmc'@'localhost' for table 't2'
gbase> update t2 set vid = 100 where vid = 1;
ERROR 1142 (42000): UPDATE command denied to user 'test_dmc'@'localhost' for table 't2'
gbase> drop table t2;
ERROR 1142 (42000): DROP command denied to user 'test_dmc'@'localhost' for table 't2'
对test_crm只有create table、select、insert权限;
gbase> use test_crm;
Query OK, 0 rows affected (Elapsed: 00:00:00.00)
gbase> create table t3 (vid int);
Query OK, 0 rows affected (Elapsed: 00:00:00.04)
gbase> select * from t3;
+------+
| vid |
+------+
| 1 |
+------+
1 row in set (Elapsed: 00:00:00.15)
gbase> delete from t3;
ERROR 1142 (42000): DELETE command denied to user 'test_dmc'@'localhost' for table 't3'
gbase> drop table t3;
ERROR 1142 (42000): DROP command denied to user 'test_dmc'@'localhost' for table 't3'
步骤6:收回权限
收回权限test_dmc,并删除test_dmc用户;
[gbase@mpp953 ~]$ gccli -uroot -pgbase
GBase client 9.5.3.22.126635. Copyright (c) 2004-2022, GBase. All Rights Reserved.
gbase> REVOKE ALL ON test_dmc.* FROM test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> REVOKE SELECT ON test_etl.* FROM test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.05)
gbase> REVOKE create,select,insert ON test_crm.* FROM test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
flush privileges;
gbase> SHOW GRANTS FOR test_dmc;
+------------------------------------------------------------------------------------------------+
| Grants for test_dmc@% |
+------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.*.* TO 'test_dmc'@'%' IDENTIFIED BY PASSWORD *4D13C9D8FFE2F7628D9DE333C27B56DCCE7F9502' |
+------------------------------------------------------------------------------------------------+
1 row in set (Elapsed: 00:00:00.00)
gbase> DROP USER test_dmc;
Query OK, 0 rows affected (Elapsed: 00:00:00.02)
grant option 授权的用户可以将权限授权给其他用户
max_queries_per_hour count 每小时可以执行count次查询
max_updates_per_hour count 每小时可以执行count次更新
max_connections_per_hour count 每小时可以建立count次连接
max_user_connections count 单个用户可以同时具有count个连接
撤销权限的巨坑
撤销语句要和授权语句完全一致
假如你给用户 pig@% 授权的语句如下:
gbase> GRANT SELECT ON test.user TO 'pig'@'%';
那么使用如下的语句,根本无法撤销上述的查询权限(即不能撤销该用户对 test 数据库中 user 表的 SELECT 操作权限):
gbase> REVOKE SELECT ON *.* FROM 'pig'@'%';
而且使用下面的语句,还会报错:
gbase> REVOKE SELECT ON test.* FROM 'pig'@'%';
ERROR 1141 (42000): There is no such grant defined for user 'pig' on host '%'
同样地,如果你使用下面的语句给用户 pig@% 授权:
GRANT SELECT ON *.* TO 'pig'@'%';
那么使用下面的语句,根本无法撤销该用户对 test 数据库中 user 表的 SELECT 权限:
REVOKE SELECT ON test.user FROM 'pig'@'%';
权限 USAGE 是无法撤销的
创建用户的时候,默认会赋予 USAGE 权限:
GRANT USAGE ON *.* TO 'user_name'@'host';
但是 USAGE 权限无法撤销。
热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529