一、DM预定义角色
达梦数据库提供了一系列预定义角色,这些角色已经包含了常用的权限集合,方便管理员快速授权。
1.1 主要预定义角色及其权限
- PUBLIC
-
- 所有用户自动拥有的基础角色
- 默认包含一些最基本的权限
- 注意:谨慎向PUBLIC授予权限,因为会影响所有用户
- DBA
-
- 数据库管理员角色
- 包含绝大多数系统权限,仅次于SYSDBA
- 典型权限:CREATE USER, CREATE TABLE, CREATE VIEW等
- RESOURCE
-
- 资源创建角色
- 允许用户创建数据库对象
- 包含权限:CREATE TABLE, CREATE PROCEDURE, CREATE SEQUENCE等
- CONNECT
-
- 基本连接角色
- 允许用户连接到数据库
- 包含权限:CREATE SESSION
- SELECT_CATALOG_ROLE
-
- 数据字典查询角色
- 允许查询系统视图和字典表
- EXECUTE_CATALOG_ROLE
-
- 数据字典执行角色
- 允许执行系统包和过程
- DELETE_CATALOG_ROLE
-
- 数据字典删除角色
- 允许删除系统对象(谨慎使用)
二、角色创建
2.1 创建角色语法
sql
CREATE ROLE <角色名>
[NOT IDENTIFIED | IDENTIFIED BY <密码> | IDENTIFIED EXTERNALLY];
参数说明:
- NOT IDENTIFIED:默认选项,角色不需要密码即可启用
- IDENTIFIED BY:设置角色密码,启用角色时需要提供密码
- IDENTIFIED EXTERNALLY:通过外部服务验证角色
eg:
- 创建基础角色:
sql
CREATE ROLE report_viewer;
- 创建带密码的安全角色:
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 <角色名>;
授权示例:
- 授予系统权限:
sql
GRANT CREATE SESSION, CREATE TABLE TO app_developer;
- 授予对象权限:
sql
GRANT SELECT, INSERT ON sales.orders TO sales_operator;
- 授予角色给另一个角色:
sql
GRANT resource TO senior_developer;
3.2 从角色回收权限
sql
-- 回收系统权限
REVOKE <系统权限> FROM <角色名>;
-- 回收对象权限
REVOKE <对象权限> ON <对象名> FROM <角色名>;
回收示例:
- 回收系统权限:
sql
REVOKE CREATE TABLE FROM junior_developer;
- 回收对象权限:
sql
REVOKE INSERT ON hr.employees FROM clerk;
- 从角色回收另一个角色:
sql
REVOKE resource FROM project_team;
四、角色分配与回收
4.1 将角色授予用户
sql
GRANT <角色名> TO <用户名> [WITH ADMIN OPTION];
WITH ADMIN OPTION:允许用户将该角色授予其他用户
分配示例:
- 基本角色分配:
sql
GRANT report_viewer TO user1;
- 带管理权限的分配:
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;
示例:
- 设置特定默认角色:
sql
ALTER USER user1 DEFAULT ROLE report_viewer, data_reader;
- 设置除某些角色外的所有角色为默认:
sql
ALTER USER user1 DEFAULT ROLE ALL EXCEPT admin_role;
5.2 启用/禁用角色
sql
SET ROLE <角色名> [IDENTIFIED BY <密码>];
SET ROLE ALL [EXCEPT <角色列表>];
SET ROLE NONE;
示例:
- 启用单个角色:
sql
SET ROLE audit_role IDENTIFIED BY "audit123";
- 启用多个角色:
sql
SET ROLE role1, role2;
- 禁用所有角色:
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;

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