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

写在后面:

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

相关推荐
0xDevNull3 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希4 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神4 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员4 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存