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

写在后面:

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

相关推荐
正在走向自律14 分钟前
企业微信API接口发消息实战:从0到1的技术突破之旅
java·数据库·企业微信·accesstoken·agentid·corpid·企业微信发消息
flying jiang23 分钟前
Oracle 和 MySQL 中的日期类型比较
数据库
胖头鱼的鱼缸(尹海文)26 分钟前
数据库管理-第352期 从需求看懂Oracle RAC多租户环境的Service(20250729)
数据库·oracle
会掉头发31 分钟前
PostgreSQL缓冲区管理器
数据库·oracle
Ice__Cai32 分钟前
Django 视图详解(View):处理请求与返回响应的核心
数据库·后端·python·django·pip
还是奇怪1 小时前
利用SQL文件上传注入植入WebShell
数据库·sql
Jay Kay2 小时前
跳跃表可视化深度解析:动态演示数据结构核心原理
数据结构·数据库
测试者家园2 小时前
慢查询日志在性能优化中的价值
sql·性能优化·性能测试·慢查询·持续测试·智能化测试
千册5 小时前
python+pyside6+sqlite 数据库测试
数据库·python·sqlite
java叶新东老师7 小时前
PowerDesigner 画ER图并生成sql 教程
数据库·sql