达梦数据库(DM Database)角色管理详解|了解DM预定义的各种角色,掌握角色创建、角色的分配和回收

一、DM预定义角色

达梦数据库提供了一系列预定义角色,这些角色已经包含了常用的权限集合,方便管理员快速授权。

1.1 主要预定义角色及其权限

  1. PUBLIC
    • 所有用户自动拥有的基础角色
    • 默认包含一些最基本的权限
    • 注意:谨慎向PUBLIC授予权限,因为会影响所有用户
  1. DBA
    • 数据库管理员角色
    • 包含绝大多数系统权限,仅次于SYSDBA
    • 典型权限:CREATE USER, CREATE TABLE, CREATE VIEW等
  1. RESOURCE
    • 资源创建角色
    • 允许用户创建数据库对象
    • 包含权限:CREATE TABLE, CREATE PROCEDURE, CREATE SEQUENCE等
  1. CONNECT
    • 基本连接角色
    • 允许用户连接到数据库
    • 包含权限:CREATE SESSION
  1. SELECT_CATALOG_ROLE
    • 数据字典查询角色
    • 允许查询系统视图和字典表
  1. EXECUTE_CATALOG_ROLE
    • 数据字典执行角色
    • 允许执行系统包和过程
  1. DELETE_CATALOG_ROLE
    • 数据字典删除角色
    • 允许删除系统对象(谨慎使用)

二、角色创建

2.1 创建角色语法

sql 复制代码
CREATE ROLE <角色名>
  [NOT IDENTIFIED | IDENTIFIED BY <密码> | IDENTIFIED EXTERNALLY];

参数说明:

  • NOT IDENTIFIED:默认选项,角色不需要密码即可启用
  • IDENTIFIED BY:设置角色密码,启用角色时需要提供密码
  • IDENTIFIED EXTERNALLY:通过外部服务验证角色

eg:

  1. 创建基础角色:
sql 复制代码
CREATE ROLE report_viewer;
  1. 创建带密码的安全角色:
sql 复制代码
CREATE ROLE finance_operator IDENTIFIED BY "SecurePass123";

创建一个角色role1

sql 复制代码
create role role1;

创建一张tab1表做个测试

sql 复制代码
CREATE TABLE TAB1(ID INT,NAME VARCHAR(40));
INSERT INTO TAB1 VALUES(1,'TEST1'),(2,'TEST2');
GRANT ROLE1 TO TEST1;

(这里出现重复的是因为我一条语句执行了两遍,正常情况下只有1、2两行)

再创建TAB2

2.2 示例

sql 复制代码
-- 1.查看现有角色
SELECT * FROM DBA_ROLES;

-- 2.创建新角色
CREATE ROLE ROLE1;

-- 3.创建表并插入测试数据
CREATE TABLE TAB1(ID INT, NAME VARCHAR(40));
INSERT INTO TAB1 VALUES(1,'TEST1'),(2,'TEST2');

-- 4.创建用户(如果不存在)
CREATE USER TEST1 IDENTIFIED BY "password123";

-- 5.授予基本连接权限
GRANT CREATE SESSION TO TEST1;

-- 6.将角色授予用户
GRANT ROLE1 TO TEST1;

-- 7.验证授予是否成功
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'TEST1';

⚠️注意必须要先创建用户TEST1并成功授予角色,这句话才可以执行成功,否则会报错:-2509:无效的用户或角色[TEST1],因为作者在这里出过错

当时敲的代码为:

sql 复制代码
SELECT * FROM DBA_ROLES;
CREATE ROLE ROLE1;
CREATE TABLE TAB1(ID INT,NAME VARCHAR(40));
INSERT INTO TAB1 VALUES(1,'TEST1'),(2,'TEST2');
GRANT ROLE1 TO TEST1;
//报错-2509:无效的用户或角色[TEST1]

所以得注意!!!

三、角色权限管理

3.1 为角色授予权限

sql 复制代码
-- 授予系统权限
GRANT <系统权限> TO <角色名>;

-- 授予对象权限
GRANT <对象权限> ON <对象名> TO <角色名>;

授权示例:

  1. 授予系统权限:
sql 复制代码
GRANT CREATE SESSION, CREATE TABLE TO app_developer;
  1. 授予对象权限:
sql 复制代码
GRANT SELECT, INSERT ON sales.orders TO sales_operator;
  1. 授予角色给另一个角色:
sql 复制代码
GRANT resource TO senior_developer;

3.2 从角色回收权限

sql 复制代码
-- 回收系统权限
REVOKE <系统权限> FROM <角色名>;

-- 回收对象权限
REVOKE <对象权限> ON <对象名> FROM <角色名>;

回收示例:

  1. 回收系统权限:
sql 复制代码
REVOKE CREATE TABLE FROM junior_developer;
  1. 回收对象权限:
sql 复制代码
REVOKE INSERT ON hr.employees FROM clerk;
  1. 从角色回收另一个角色:
sql 复制代码
REVOKE resource FROM project_team;

四、角色分配与回收

4.1 将角色授予用户

sql 复制代码
GRANT <角色名> TO <用户名> [WITH ADMIN OPTION];

WITH ADMIN OPTION:允许用户将该角色授予其他用户

分配示例:

  1. 基本角色分配:
sql 复制代码
GRANT report_viewer TO user1;
  1. 带管理权限的分配:
sql 复制代码
GRANT project_lead TO manager WITH ADMIN OPTION;

4.2 从用户回收角色

sql 复制代码
REVOKE <角色名> FROM <用户名>;

回收示例:

sql 复制代码
REVOKE temp_access FROM contractor_user;

五、角色使用与激活

5.1 设置默认角色

sql 复制代码
ALTER USER <用户名> DEFAULT ROLE <角色列表> | ALL [EXCEPT <角色列表>] | NONE;

示例:

  1. 设置特定默认角色:
sql 复制代码
ALTER USER user1 DEFAULT ROLE report_viewer, data_reader;
  1. 设置除某些角色外的所有角色为默认:
sql 复制代码
ALTER USER user1 DEFAULT ROLE ALL EXCEPT admin_role;

5.2 启用/禁用角色

sql 复制代码
SET ROLE <角色名> [IDENTIFIED BY <密码>];
SET ROLE ALL [EXCEPT <角色列表>];
SET ROLE NONE;

示例:

  1. 启用单个角色:
sql 复制代码
SET ROLE audit_role IDENTIFIED BY "audit123";
  1. 启用多个角色:
sql 复制代码
SET ROLE role1, role2;
  1. 禁用所有角色:
sql 复制代码
SET ROLE NONE;

六、角色信息查询

6.1 查看所有角色

sql 复制代码
-- 查看所有角色定义
SELECT * FROM DBA_ROLES;

(这个时候我还没创建role1)

6.2 查看角色权限

sql 复制代码
-- 查看角色拥有的系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = '<角色名>';
-- 查看角色拥有的对象权限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = '<角色名>';

eg:

sql 复制代码
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'TEST1';
sql 复制代码
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'TEST1';

6.3 查看用户拥有的角色

sql 复制代码
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = '<用户名>';

例如:

sql 复制代码
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'TEST1';

6.4 查看角色包含的角色

sql 复制代码
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = '<角色名>';

七、删除角色

删除角色的命令跟删除其他对象的命令一样

sql 复制代码
-- 删除角色基本语法
DROP ROLE [IF EXISTS] role_name;

-- 安全删除角色
DROP ROLE IF EXISTS role_name;
sql 复制代码
//例如:
DROP ROLE ROLE1;

写在后面:

图片为手机拍摄而非截图实属无奈,望体谅。以后作者方便截图的地方都会采取截图的形式。

相关推荐
不羁。。2 小时前
【撸靶笔记】第八关:GET - Blind - Boolian Based - Single Quotes
数据库·sql·mybatis
AwhiteV3 小时前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
m0_595199853 小时前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
爱尚你19934 小时前
MySQL 三大日志:redo log、undo log、binlog 详解
数据库·mysql
小猿姐5 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
NocoBase6 小时前
10 个开源工具,快速构建数据应用
数据库·低代码·开源
麻辣清汤7 小时前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
钢铁男儿7 小时前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
Kan先生8 小时前
对象存储解决方案:MinIO 的架构与代码实战
数据库·python
超级迅猛龙9 小时前
保姆级Debezium抽取SQL Server同步kafka
数据库·hadoop·mysql·sqlserver·kafka·linq·cdc