达梦数据库(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;

写在后面:

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

相关推荐
m0_748248028 分钟前
Redis 简介与安装指南
数据库·redis·缓存
Elastic 中国社区官方博客5 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪7 小时前
两次连接池泄露的BUG
java·数据库
南宫乘风8 小时前
基于 Flask + APScheduler + MySQL 的自动报表系统设计
python·mysql·flask
TDengine (老段)8 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349849 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE9 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102169 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎10 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP10 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql