openGauss 用户权限统计及权限回收

  • 适用范围

  • 问题概述

  • 解决方案

  • 一、环境配置

  • 二、用户权限统计(解析acl权限方式)

    • 1、database 权限

    • 2、schema 权限

    • 3、table 权限

    • 4、table column 权限

    • 5、tablespace 权限

    • 6、sequence 权限

    • 7、function 权限

    • 8、procedure 权限

    • 9、view 权限

    • 10、系统权限

    • 11、role 权限

    • 12、any 权限

  • 三、用户权限统计(查询information_schema 相关视图方式)

    • 1、table、view 权限

    • 2、table column 权限

    • 3、function、procedure 权限

    • 4、usage 权限

适用范围

操作系统:CentOS 7.6
数据库:openGauss 6.0.1

问题概述

解析opengauss 数据库中acl权限相关字段,如pg_class 中relacl 字段,将其转换成对应的select、update等权限信息,并拼接revoke 相应权限的sql 语句。

解决方案

一、环境配置

图片

二、用户权限统计

(解析acl权限方式)

本案例为在postgres 库中创建用户,然后创建testdb 数据库,后续在testdb 库中创建用户对象并进行相关授权操作。

创建用户testuser:

\c postgrescreate user testuser with password 'Test1234';
创建数据库testdb
    create database testdb;\c testdb;

    1、database 权限

    授予testuser 访问testdb库以及在testdb库创建新schema 的权限

    grant connect,create on database testdb to testuser;

    查询testuser的database 权限​​​​​​​

    with t as (select datname,(aclexplode(datacl)).grantee,(aclexplode(datacl)).privilege_typefrom pg_database)select t.datname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on database '||t.datname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    2、schema 权限

    创建schema1

    create schema schema1;

    授予testuser 在 schema1 模式创建对象的权限

    grant create,usage on schema schema1 to testuser;

    查询testuser 的schema 权限​​​​​​​

    with t as (select nspname "schema",(aclexplode(nspacl)).grantee,(aclexplode(nspacl)).privilege_typefrom pg_namespace)select t.schema,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on schema '||t.schema||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    3、table 权限

    创建public.t1 表

    create table public.t1 (id int);

    授予testuser 对 public.t1 的增删改查权限

    grant select,insert,update,delete on table public.t1 to testuser;

    查询testuser 的table 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('r','f'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on table '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';
    
    
    

    图片

    4、table column 权限

    创建public.t2 表

    create table public.t2 (id int,name char(5));

    授予testuser 对public.t2 表的id列的select、insert 权限

    grant select(id),insert(id) on table public.t2 to testuser;

    查询testuser 的table column 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname "table_name",attname "column_name",(aclexplode(attacl)).grantee,(aclexplode(attacl)).privilege_typefrom pg_attribute atinner join pg_class cl on cl.oid=at.attrelidinner join pg_namespace na on cl.relnamespace=na.oid)select t.schema,t.table_name,t.column_name,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||'('||t.column_name||') on table '||t.schema||'.'||t.table_name||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    5、tablespace 权限

    创建tbs1 表空间

    create tablespace tbs1 location '/gaussdata/openGauss/tbs';

    授予testuser 在tbs1 表空间创建表的权限

    grant create on tablespace tbs1 to testuser;

    查询testuser 的tablespace 权限​​​​​​​

    with t as (select spcname,(aclexplode(spcacl)).grantee,(aclexplode(spcacl)).privilege_typefrom pg_tablespace)select t.spcname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on tablespace '||t.spcname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    6、sequence 权限

    创建public.seq1 序列

    create sequence public.seq1;

    授予testuser 对 public.seq1 的查询、更新等权限

    grant select,update,usage on sequence public.seq1 to testuser;

    查询testuser 的sequence 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('S','L'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on sequence '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    7、function 权限

    创建public.fun1 函数​​​​​​​

    create function public.fun1(int,int) returns intas 'select $1+$2;'language sqlimmutablereturns null on null input;

    testuser 默认具有fun1 的执行权限
    授予testuser 修改fun1属性的权限,但前提是testuser 拥有修改public 中对象的权限​​​​​​​

    grant usage,create,alter on schema public to testuser;grant alter on function public.fun1(int,int) to testuser;

    查询testuser 的function 权限​​​​​​​

    with t as (select pr.oid,na.nspname "schema",pr.proname,(aclexplode(proacl)).grantee,(aclexplode(proacl)).privilege_typefrom pg_proc prinner join pg_namespace na on na.oid=pr.pronamespacewhere pr.prokind='f')select t.schema,t.proname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on function '||t.schema||'.'||t.proname||'('||pg_get_function_arguments(t.oid)||') from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    8、procedure 权限

    创建insert_data_t1 存储过程
    实现调用上述创建的seq1 序列,往t1表里插入数据​​​​​​​

    create procedure public.insert_data_t1()isbegininsert into public.t1 values(nextval('public.seq1'));end;/

    testuser 默认具有insert_data_t1 的执行权限
    授予testuser 修改 insert_data_t1 属性的权限,但前提是testuser 拥有修改public 中对象的权限

    grant alter on procedure public.insert_data_t1() to testuser;

    查询testuser 的procedure 权限​​​​​​​

    with t as (select pr.oid,na.nspname "schema",pr.proname,(aclexplode(proacl)).grantee,(aclexplode(proacl)).privilege_typefrom pg_proc prinner join pg_namespace na on na.oid=pr.pronamespacewhere pr.prokind='p')select t.schema,t.proname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on procedure '||t.schema||'.'||t.proname||'('||pg_get_function_arguments(t.oid)||') from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    9、view 权限

    创建view_t1 视图

    create view public.view_t1 as select * from public.t1;

    授予testuser 查询view_t1 的权限

    grant select on table public.view_t1 to testuser;

    查询testuser 的view 权限​​​​​​​

    with t as (select na.nspname "schema",cl.relname,(aclexplode(relacl)).grantee,(aclexplode(relacl)).privilege_typefrom pg_class clinner join pg_namespace na on na.oid=cl.relnamespacewhere cl.relkind in ('v','m'))select t.schema,t.relname,ro.rolname,t.privilege_type,'revoke '||t.privilege_type||' on table '||t.schema||'.'||t.relname||' from '||ro.rolname||';' as revoke_sqlfrom tinner join pg_roles ro on ro.oid=t.granteewhere ro.rolname='testuser';

    图片

    10、系统权限

    系统权限又称用户属性
    查询testuser 的系统权限​​​​​​​

    select rolname as user_name,rtrim(decode(rolsuper,'t','SuperUser,')||decode(rolcreaterole,'t','CreateRole,')||decode(rolcreatedb,'t','CreateDB,')||decode(rolcatupdate,'t','CatUpdate,')||decode(rolcanlogin,'t','Login,')||decode(rolreplication,'t','Replication,')||decode(rolauditadmin,'t','AuditAdmin,')||decode(rolsystemadmin,'t','Sysadmin,')||decode(rolmonitoradmin,'t','MonitorAdmin,')||decode(roloperatoradmin,'t','OperatorAdmin,')||decode(rolpolicyadmin,'t','PolicyAdmin'),',') as role_sys_privilegesfrom pg_roles where rolname='testuser';

    图片

    11、role 权限

    创建role1 角色

    create role role1 with password 'Test1234';

    将role1 角色授予testuser 用户

    grant role1 to testuser;

    查询testuser 拥有的role 权限​​​​​​​

    select ro1.rolname "role",ro2.rolname "user_name",'revoke '||role||' from '||user_name||';' as revoke_sqlfrom pg_auth_members auinner join pg_roles ro1 on ro1.oid=au.roleidinner join pg_roles ro2 on ro2.oid=au.memberwhere user_name='testuser';

    图片

    12、any 权限

    授予testuser 用户create any table,select any table 权限

    grant create any table,select any table to testuser;

    查询testuser 拥有的any 权限​​​​​​​

    select rolname,privilege_type,'revoke '||privilege_type||' from '||rolname||';' as revoke_sqlfrom gs_db_privilege gsinner join pg_roles ro on ro.oid=gs.roleidwhere rolname='testuser';

    图片

    三、用户权限统计

    (查询information_schema 相关视图方式)

    修改search_path 参数

    set search_path=information_schema;

    1、table、view 权限

    select * from table_privileges where grantee='testuser' and grantor<>'testuser';

    图片

    2、table column 权限

    注:授予表级select、insert 权限时,同时会将表的全部列的select、insert 权限记录在column_privileges 中。

    select * from column_privileges where grantee='testuser' and grantor<>'testuser';

    图片

    3、function、procedure 权限

    ​​​​​​​

    select * from routine_priv grantee='testuser' and grantor<>'testuser';ileges where

    4、usage 权限

    select * from usage_privileges where grantee='testuser' and grantor<>'testuser';

    本文作者:车金陆,墨天轮数据库管理服务团队技术顾问。

    <think>好的,用户想了解openGauss的常用SQL命令和操作指令。首先,我需要回忆之前提供的引用内容,看看有哪些相关的信息可以整合。引用[1]提到了华为openGauss数据库命令的多样性和灵活性,并建议参考官方文档。引用[2]详细介绍了gsql工具的连接方式,比如使用gsql -d postgres -U 用户名 -W密码来连接数据库。引用[3]提到了安装时的命令,比如sh install.sh -w密码,这可能对用户安装有帮助,但用户现在更关注的是SQL命令和操作指令。 接下来,用户可能需要从基础开始,比如如何连接数据库,然后创建用户数据库,进行表操作等。根据引用[2],连接数据库的命令已经给出,应该放在最前面。然后,常用的SQL命令包括用户权限管理,比如创建用户、授权,这部分需要结合标准的SQL语法,但openGauss可能有自己的扩展或特定命令,需要确保准确性。 数据库管理方面,创建、查看、切换数据库是基本操作,可以列出CREATE DATABASE、\l、\c等命令。表操作包括创建表、插入数据、查询、更新、删除,这些都是标准的SQL,但需要提醒用户注意openGauss的兼容性和特定语法。此外,索引的创建和维护也很重要,可以提到CREATE INDEX命令。 备份与恢复是运维中的关键,可能需要使用gs_dump和gs_restore工具,这些在引用中没有提到,但属于常见操作,需要确认是否属于openGauss的常用命令。事务控制如BEGIN、COMMIT、ROLLBACK也是必要的,确保用户了解事务的使用。 系统维护方面,查看数据库状态、日志、版本信息可能涉及VACUUM、\d+等命令,需要结合openGauss的特定命令。引用[3]中的安装命令可能不在用户当前需求范围内,但可以忽略。 最后,注意事项部分需要提醒用户权限问题、密码安全、备份重要性,以及参考官方文档,这些在引用[1]和[2]中都有提到。生成的相关问题需要围绕用户可能进一步想了解的内容,比如性能优化权限管理、备份恢复、与其他数据库的差异等。 需要检查是否有遗漏的重要命令,比如用户管理中的修改密码、权限回收,或者openGauss特有的命令如表空间管理、分区表操作等。另外,确保所有命令的语法正确,比如在创建用户时使用WITH PASSWORD,授权时使用GRANT等。可能还需要提到连接参数中的端口和主机,如-h和-p选项,这在引用[2]的连接语句中没有出现,但实际使用中可能需要。 总结来说,结构应该分为连接、用户管理、数据库管理、表操作、索引、备份恢复、事务控制、系统维护和注意事项。每个部分列出常用命令和示例,确保用户能够一步步操作。同时,引用相关文献,比如在连接数据库时引用[2],注意事项引用[1]和[2]。</think>### OpenGauss 常用SQL命令及操作指令指南 #### **一、基础连接与退出** 1. **连接数据库** ```bash gsql -d 数据库名 -U 用户名 -W 密码 -h 主机地址 -p 端口 ``` 示例(默认连接本地数据库): ```bash gsql -d postgres -U gaussdb -W 'Test123@' [^2] ``` 2. **退出交互界面** ```sql \q ``` --- #### **二、用户权限管理** 1. **创建用户** ```sql CREATE USER 用户名 WITH PASSWORD '密码'; ``` 2. **授权** ```sql GRANT 权限 (SELECT/INSERT/ALL等) ON 表名 TO 用户; ``` 3. **查看用户列表** ```sql \du ``` --- #### **三、数据库管理** 1. **创建数据库** ```sql CREATE DATABASE 数据库名; ``` 2. **查看所有数据库** ```sql \l ``` 3. **切换数据库** ```sql \c 数据库名 ``` --- #### **四、表操作** 1. **创建表** ```sql CREATE TABLE 表名 ( 列1 数据类型 PRIMARY KEY, 列2 数据类型 NOT NULL ); ``` 2. **插入数据** ```sql INSERT INTO 表名 (列1, 列2) VALUES (值1, 值2); ``` 3. **查询数据** ```sql SELECT * FROM 表名 WHERE 条件; ``` 4. **更新数据** ```sql UPDATE 表名 SET 列=新值 WHERE 条件; ``` 5. **删除数据** ```sql DELETE FROM 表名 WHERE 条件; ``` --- #### **五、索引与性能优化** 1. **创建索引** ```sql CREATE INDEX 索引名 ON 表名 (列名); ``` 2. **查看表结构** ```sql \d+ 表名 ``` --- #### **六、备份与恢复** 1. **逻辑备份(导出数据库)** ```bash gs_dump -U 用户名 -W 密码 -f 备份文件名.sql 数据库名 ``` 2. **恢复备份** ```bash gs_restore -U 用户名 -W 密码 -d 目标数据库名 备份文件名.sql ``` --- #### **七、事务控制** ```sql BEGIN; -- 开启事务 COMMIT; -- 提交事务 ROLLBACK; -- 回滚事务 ``` --- #### **八、系统维护** 1. **查看数据库状态** ```sql SELECT * FROM pg_stat_activity; -- 查看当前连接会话 ``` 2. **清理与优化** ```sql VACUUM FULL; -- 回收空间并优化性能 ``` --- #### **注意事项** 1. **权限问题**:操作前需确保用户有对应权限[^1]。 2. **密码安全**:连接时避免明文密码暴露,建议通过交互输入。 3. **备份重要性**:生产环境务必定期备份[^1]。 4. **兼容性**:部分SQL语法可能与标准PostgreSQL存在差异,需参考官方文档[^1]。 --- §§ 相关问题 §§ 1. 如何监控openGauss数据库的运行性能? 2. openGauss中如何实现用户权限的细粒度控制? 3. 备份与恢复操作时需要注意哪些兼容性问题? 4. openGauss与PostgreSQLSQL语法上的主要差异有哪些?
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    Gauss松鼠会

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值