磐维数据库的权限使用

发布于:2025-06-11 ⋅ 阅读:(26) ⋅ 点赞:(0)

一、磐维数据库的权限

1、权限分类

在磐维数据库中权限分为两种:系统权限和对象权限。
(1)系统权限:系统权限又称为用户属性,包括SYSADMIN、CREATEDB、CREATEROLE、AUDITADMIN、MONADMIN、OPRADMIN、POLADMIN和LOGIN等。 系统权限一般通过CREATE/ALTER ROLE语法来指定。其中,SYSADMIN权限可以通过GRANT/REVOKE ALL PRIVILEGE授予或撤销。但系统权限无法通过ROLE和USER的权限被继承,也无法授予PUBLIC。
系统权限及功能说明如下:

系统权限

权限说明

SYSADMIN

允许用户创建数据库,创建表空间,允许用户创建用户/角色允许用户查看、删除审计日志允许用户查看其它用户的数据

CREATEDB

允许用户创建数据库

CREATEROLE

允许用户创建用户角色

AUDITADMIN

允许用户查看、删除审计日志

MONADMIN

允许用户对系统模式dbe_perf及该模式下的监控视图或函数进行查看和权限管理

OPRADMIN

允许用户使用Roach工具执行数据库备份和恢复

POLADMIN

允许用户创建资源标签、创建动态数据脱敏策略和统一审计策略

LOGIN

允许用户登录数据库

INHERIT

允许用户继承所在组的角色的权限

REPLICATION

允许用户执行流复制相关操作

USEFT

允许用户创建外表

(2)对象权限:指在数据库、模式、表、视图、函数等数据库对象上执行操作的权限,不同的权限与不同的对象类型关联,比如表空间的创建、修改、删除,数据库的连接、创建、删除权限,表的增删改查权限,函数的执行权限等。
数据库对象创建后,进行对象创建的用户就是该对象的所有者。数据库系统管理员具有与对象所有者相同的权限。也就是说对象创建后,默认只有对象所有者或者系统管理员可以查询、修改和销毁对象,以及通过GRANT将对象的权限授予其他用户。
对象权限可以通过角色(ROLE)被继承,这样方便用户将单个的权限打包成一个角色进行权限管理。
对象权限及权限说明如下:

对象分类

对象权限

权限说明

TABLESPACE

CREATE

允许用户在指定的表空间中创建表,允许在创建数据库和模式的时候把该表空间指定为缺省表空间。

ALTER

允许用户对指定的表空间执行ALTER语句修改属性

DROP

允许用户删除指定的表空间

COMENT

允许用户对指定的表空间定义或修改注释

DATABASE

CONNECT

允许用户连接到指定的数据库

TEMP

允许用户在指定的数据库中创建临时表

CREATE

允许用户在指定的数据库里创建模式

ALTER

允许用户对指定的数据库执行虹IER语句修改属性

DROP

允许用户删除指定的数据库

COMENT

允许用户对指定的数据库定义或修改注释

FUNCTION

EXECUTE

允许用户使用指定的函数,以及利用这些函数实现的操作符。

ALTER

允许用户对指定的函数执行ALTER语句修改属性

DROP

允许用户删除指定的函数

COMENT

允许用户对指定的函数定义或修改注释

TABLE

INSERT

允许用户对指定的表执行INSERT语句插入数据

DELETE

允许用户对指定的表执行DELETE语句删除表中数据

UPDATE

允许用户对指定的表执行UPDATE语句

SELECT

允许用户对指定的表执行SELET语句

TRUNCATE

允许用户执行TRUNCATE语句删除指定表中的所有记录

REFERENCES

允许用户对指定的表创建一个外键约束

TRIGGER

允许用户在指定的表上创建触发器

ALTER

允许用户对指定的表执行ALTER语句修改属性

DROP

允许用户删除指定的表

COMENT

允许用户对指定的表定义或修改注释

INDEX

允许用户在指定表上创建索引,并管理指定表上的索引

VACUUM

允许用户对指定的表执行ANALYZE和VACUUM操作

2、权限的授予和回收

(1)系统权限授权/回收:使用CREATE USER、CREATE ROLE、ALTER USER、ALTER ROLE命令授权/回收系统权限。
下面示例是CREATE USER时对用户授权/回收SYSADMIN系统权限:
查看create user的语法,其中option子句中包括了系统权限列表

postgres=# \h create user
Command:     CREATE USER
Description: define a new database role
Syntax:
CREATE USER [IF NOT EXISTS] user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [ EXPIRED ] | DISABLE
 };

where option can be:
{SYSADMIN | NOSYSADMIN}
    | {MONADMIN | NOMONADMIN}
    | {OPRADMIN | NOOPRADMIN}
    | {POLADMIN | NOPOLADMIN}
    | {AUDITADMIN | NOAUDITADMIN}
    | {SSOADMIN | NOSSOADMIN}
    | {CREATEDB | NOCREATEDB}
    | {USEFT | NOUSEFT}
    | {CREATEROLE | NOCREATEROLE}
    | {INHERIT | NOINHERIT}
    | {LOGIN | NOLOGIN}
    | {REPLICATION | NOREPLICATION}
    | {INDEPENDENT | NOINDEPENDENT}
    | {VCADMIN | NOVCADMIN}
    | {PERSISTENCE | NOPERSISTENCE}
    | CONNECTION LIMIT connlimit
    | VALID BEGIN 'timestamp'
    | VALID UNTIL 'timestamp'
    | RESOURCE POOL 'respool'

创建testuser用户时授予sysadmin权限:

postgres=# create user testuser with sysadmin  IDENTIFIED BY 'test%1234';
CREATE ROLE

查看testuser用户的权限

回收sysadmin权限

postgres=# alter user testuser nosysadmin;
ALTER ROLE

再次查看testuser用户的权限

(2)对象权限授权/回收:使用GRANT/REVOKE命令授予/回收对象权限。
下面示例是对testuser2用户授权/回收testtab表的增删改查对象权限:
查看testuser模式下的表

postgres=> \dt
List of relations
Schema | Name | Type | Owner | Storage
----------±--------±------±---------±-----------------------------------------------
testuser | testtab | table | testuser | {orientation=row,compression=no,fillfactor=80}
(1 row)

把testuser.testtab表的 insert,update,delete,select权限授予testuser2用户

postgres=> grant insert,update,delete,select  on table testuser.testtab to testuser2;
GRANT

查看testuser2用户的权限

从testuser2用户回收testuser.testtab表的 insert,update,delete,select权限

postgres=> revoke insert,update,delete,select on table testuser.testtab from testuser2;
REVOKE

再次查看testuser2用户的权限

3、查看用户拥有的权限常用sql语句

新建testuser用户

postgres=# create user testuser  IDENTIFIED BY 'test%1234';
CREATE ROLE

查看用户在数据库中拥有的权限

select a.datname,b.rolname,string_agg(a.pri_t,',') 
from 
(select datname,(aclexplode(COALESCE(datacl, acldefault('d'::"char",datdba)))).grantee as grantee,(aclexplode(COALESCE(datacl, acldefault('d'::"char", datdba)))).privilege_type as pri_t 
     from pg_database 
     where datname not like 'template%') a,pg_roles b 
where (a.grantee=b.oid or a.grantee=0) and b.rolname='用户名' 
group by a.datname,b.rolname;

结果如下:

查看用户在schema中拥有的权限

select a.nspname,b.rolname,string_agg(a.pri_t,',') 
from 
(select nspname,(aclexplode(COALESCE(nspacl, acldefault('n'::"char",nspowner)))).grantee as grantee,(aclexplode(COALESCE(nspacl, acldefault('n'::"char",nspowner)))).privilege_type as pri_t 
        from pg_namespace 
        where nspname not like 'pg%' and nspname <> 'information_schema') a,pg_authid b  
where (a.grantee=b.oid or a.grantee=0) and b.rolname='用户名' 
group by a.nspname,b.rolname;

结果如下:

查看用户拥有的table权限

select table_name,table_schema,grantee,string_agg(privilege_type,',') 
from information_schema.table_privileges
where grantee='用户名' 
group by table_name,table_schema,grantee;

结果如下:

二、授权参考示例1

假设现在有这样的生产环境:存在业务用户yewuuser,普通用户user1
数据库yewudb(owner是yewuuser),
数据库yewudb下有schemaa,schemab。
需求:普通用户user1需要访问模式schemab下的所有对象(包括表、视图等)的所有权限,怎么实现?

Sql语句参考:
使用panweidb用户登录yewudb数据库进行授权

GRANT USAGE,CREATE ON SCHEMA schemab TO user1; 
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA  schemab TO user1;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA  schemab TO user1;
GRANT EXECUTE  ON ALL FUNCTIONS IN SCHEMA schemab TO user1;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemab GRANT ALL PRIVILEGES ON TABLES TO user1;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemab GRANT ALL PRIVILEGES ON SEQUENCES TO user1;

结果如下:

也可以通过角色统一授权,适用于给多个用户授权相同权限的场景,方便权限统一集中管理。

create user  user3    IDENTIFIED BY 'user%1234';
create role role1  IDENTIFIED BY 'user%1234';
GRANT USAGE,CREATE ON SCHEMA schemab TO role1; 
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA  schemab TO role1;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA  schemab TO role1;
GRANT EXECUTE  ON ALL FUNCTIONS IN SCHEMA schemab TO role1;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemab GRANT ALL PRIVILEGES ON TABLES TO role1;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemab GRANT ALL PRIVILEGES ON SEQUENCES TO role1;
#将角色统一授权给用户user3
grant role1 to user3;

结果如下:

三、授权参考示例2

假设现在有这样的生产环境:业务用户yewuuser,普通用户user2
数据库yewudb(owner是yewuuser),
数据库yewudb下有schemaa,schemab。
需求:普通用户user2需要访问模式schemaa下的所有对象(包括表、视图等)的增删改查权限,怎么实现?

Sql语句参考:
使用panweidb用户登录yewudb数据库进行授权

GRANT USAGE,CREATE ON SCHEMA schemaa TO user2;
GRANT SELECT,INSERT,UPDATE,DELETE  ON ALL TABLES IN SCHEMA  schemaa TO user2;
GRANT SELECT  ON ALL SEQUENCES IN SCHEMA schemaa TO user2;
GRANT EXECUTE  ON ALL FUNCTIONS IN SCHEMA schemaa TO user2;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemaa GRANT ALL PRIVILEGES ON TABLES TO user2;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemaa GRANT ALL PRIVILEGES ON SEQUENCES TO user2;

结果如下:

也可以通过角色统一授权,适用于给多个用户授权相同权限的场景,方便权限统一集中管理。

create role role2  IDENTIFIED BY 'user%1234';
GRANT USAGE,CREATE ON SCHEMA schemaa TO role2; 
GRANT SELECT,INSERT,UPDATE,DELETE  ON ALL TABLES IN SCHEMA  schemaa TO role2;
GRANT SELECT  ON ALL SEQUENCES IN SCHEMA schemaa TO role2;
GRANT EXECUTE  ON ALL FUNCTIONS IN SCHEMA schemaa TO role2;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemaa GRANT ALL PRIVILEGES ON TABLES TO role2;
ALTER DEFAULT PRIVILEGES FOR USER yewuuser IN SCHEMA  schemaa GRANT ALL PRIVILEGES ON SEQUENCES TO role2;
#将角色统一授权给用户user4
grant role2 to user4;

结果如下:

四、授权参考实例 3

创建dbid数据库

赋予dbidopr增、删、改、查、建表等权限

赋予dbidqry查询权限

--gsql -r 创建数据库
create database  dbid;
--gsql -d  dbid -r  创建用户并授予建表,增删查改表权限
create user dbidopr identified by "********";
create schema dbid;
GRANT USAGE,CREATE ON SCHEMA dbid TO dbidopr; 
GRANT select,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA  dbid TO dbidopr;
ALTER DEFAULT PRIVILEGES FOR USER omm IN SCHEMA  dbid GRANT select,INSERT,UPDATE,DELETE ON TABLES TO dbidopr;

--gsql -d  dbid -r  创建用户赋予select  on all tables权限
create user dbidqry identified by "*******";
GRANT USAGE ON SCHEMA  dbid TO dbidqry;
grant select  on all tables in schema dbid to dbidqry;
ALTER DEFAULT PRIVILEGES FOR USER omm IN SCHEMA  dbid GRANT select ON TABLES TO dbidqry;
ALTER DEFAULT PRIVILEGES FOR USER dbidopr IN SCHEMA  dbid GRANT select ON TABLES TO dbidqry;

--防止用户创建对象时不加属主,把对象创建到用户默认SCHEMA下,需要删除用户默认SCHEMA
DROP SCHEMA dbidopr;
DROP SCHEMA dbidqry;