达梦数据库权限体系详解:系统权限与对象权限

一、达梦数据库权限分类

达梦数据库的权限体系分为系统权限和对象权限两大类。

1. 系统权限(数据库权限)

系统权限是指对整个数据库系统进行操作的权限,不针对特定对象。

系统权限是达梦权限体系中的高层权限,控制用户执行系统级操作的能力,如创建用户、修改数据库参数、管理表空间等。这些权限通常只授予数据库管理员或特定管理角色,对数据库安全至关重要。

常见的系统权限包括:

sql 复制代码
CREATE USER:创建用户
ALTER USER:修改用户
DROP USER:删除用户
CREATE ROLE:创建角色
DROP ROLE:删除角色
CREATE TABLE:在用户自己的模式下创建表
CREATE ANY TABLE:在任何模式下创建表
ALTER ANY TABLE:修改任何表
DROP ANY TABLE:删除任何表
SELECT ANY TABLE:查询任何表
INSERT ANY TABLE:向任何表插入数据
UPDATE ANY TABLE:更新任何表
DELETE ANY TABLE:删除任何表的数据
CREATE VIEW:创建视图
CREATE PROCEDURE:创建存储过程
CREATE SEQUENCE:创建序列
CREATE TRIGGER:创建触发器
CREATE PUBLIC SYNONYM:创建公共同义词
DROP PUBLIC SYNONYM:删除公共同义词
BACKUP DATABASE:备份数据库
RESTORE DATABASE:恢复数据库
AUDIT ANY:设置审计选项
AUDIT ADMIN:管理审计
权限类别 常见权限 说明
用户管理 CREATE USER, ALTER USER, DROP USER 用户创建、修改和删除
角色管理 CREATE ROLE, DROP ROLE, GRANT ANY ROLE 角色创建、删除和授予
对象创建 CREATE TABLE, CREATE VIEW, CREATE PROCEDURE 各类数据库对象创建
表空间 CREATE TABLESPACE, ALTER TABLESPACE, DROP TABLESPACE 表空间管理
备份恢复 BACKUP DATABASE, RESTORE DATABASE 数据库备份与恢复
系统管理 ALTER DATABASE, ALTER SYSTEM, AUDIT ANY 数据库配置修改和审计
会话管理 CREATE SESSION, RESTRICTED SESSION 数据库连接控制
特权权限 UNLIMITED TABLESPACE, GRANT ANY PRIVILEGE 特殊权限

2. 对象权限

对象权限是指对特定数据库对象(如表、视图、序列、存储过程等)进行操作的权限。

常见的对象权限包括:

sql 复制代码
SELECT:查询表、视图、序列
INSERT:向表或视图中插入数据
UPDATE:更新表或视图中的数据
DELETE:删除表或视图中的数据
ALTER:修改表或序列的结构
REFERENCES:在表上创建外键约束
INDEX:在表上创建索引
EXECUTE:执行存储过程或函数

对象权限控制对特定数据库对象的操作能力:

对象类型 可用权限 说明
表/视图 SELECT, INSERT, UPDATE, DELETE, ALTER, INDEX, REFERENCES 数据操作和结构修改
序列 SELECT, ALTER 序列值获取和修改
存储过程/函数 EXECUTE 程序执行
EXECUTE 包内程序执行
目录 READ, WRITE 外部文件访问
物化视图 SELECT, QUERY REWRITE 物化视图访问和重写

二、权限分配与回收

2.1 系统权限管理

权限分配:

数据库权限授予使用GRANT语句实现

sql 复制代码
-- 语法:GRANT <系统权限> [, <系统权限> ...] TO <用户名> | <角色名> [WITH ADMIN OPTION];

-- 示例:将创建表的权限授予用户USER1。
GRANT CREATE TABLE TO USER1;

-- 基本授予
GRANT CREATE TABLE, CREATE VIEW TO user1;

-- 授予并允许传递权限
GRANT CREATE USER TO admin_user WITH ADMIN OPTION;

如果使用WITH ADMIN OPTION,则被授予的用户可以将该权限再授予其他用户。

权限回收:

数据库权限撤销使用REVOKE语句实现

sql 复制代码
-- 语法:REVOKE <系统权限> [, <系统权限> ...] FROM <用户名> | <角色名>;
-- 示例:撤销用户USER1创建表的权限。
REVOKE CREATE TABLE FROM USER1;

-- 回收单个权限
REVOKE CREATE TABLE FROM user1;

-- 回收多个权限
REVOKE CREATE VIEW, CREATE PROCEDURE FROM user2;

注意:系统权限的撤销不会级联。即使用WITH ADMIN OPTION授予的权限,当原始授予者的权限被撤销时,被授予者的权限不会自动撤销。

2.2 对象权限管理

权限分配:

授予对象权限:

sql 复制代码
-- 语法:GRANT <对象权限> ON [<模式名>.]<对象名> TO <用户名> | <角色名> [WITH GRANT OPTION];
-- 示例:将模式SCOTT下的表EMP的SELECT和INSERT权限授予用户USER2。
GRANT SELECT, INSERT ON SCOTT.EMP TO USER2;
-- 如果使用WITH GRANT OPTION,则被授予的用户可以将该对象权限再授予其他用户。

-- 授予表权限
GRANT SELECT, INSERT ON sales.orders TO sales_rep;

-- 授予列级权限
GRANT UPDATE (price, discount) ON products.item TO pricing_clerk;

-- 授予并允许传递权限
GRANT SELECT ON hr.employees TO hr_team WITH GRANT OPTION;

权限回收:

撤销对象权限:

sql 复制代码
-- 语法:REVOKE <对象权限> ON [<模式名>.]<对象名> FROM <用户名> | <角色名> [CASCADE CONSTRAINTS];
-- 示例:撤销用户USER2对SCOTT.EMP表的INSERT权限。
REVOKE INSERT ON SCOTT.EMP FROM USER2;

-- 回收表权限
REVOKE INSERT ON sales.orders FROM sales_rep;

-- 回收列级权限
REVOKE UPDATE (price) ON products.item FROM pricing_clerk;

-- 级联回收权限
REVOKE SELECT ON hr.employees FROM hr_team CASCADE CONSTRAINTS;

CASCADE CONSTRAINTS用于处理存在外键约束依赖的情况。

注意:

  • 对象权限的撤销可以是级联的。如果使用WITH GRANT OPTION授予的权限,在撤销时需要使用CASCADE选项来级联撤销由该用户授予的相应权限。
  • 对于REFERENCES权限的撤销,如果已经用于创建外键,则需要使用CASCADE CONSTRAINTS选项来同时删除依赖的外键约束。

总结:

  • 系统权限针对数据库级别的操作,对象权限针对特定对象的操作。
  • 授予系统权限使用WITH ADMIN OPTION,而授予对象权限使用WITH GRANT OPTION。
  • 撤销系统权限不会级联,而撤销对象权限可以级联(使用CASCADE)。
    在实际使用中,建议通过角色来管理权限,将权限授予角色,再将角色授予用户,便于权限的批量管理。

三、权限管理注意事项

3.1 权限传递选项

  • WITH ADMIN OPTION:用于系统权限,允许被授权者授予他人
  • WITH GRANT OPTION:用于对象权限,允许被授权者授予他人

3.2 权限回收差异

  • 系统权限回收不会级联
  • 对象权限回收可使用CASCADE级联回收

3.3 权限生效时间

  • 新权限需要用户重新连接生效
  • 权限回收立即生效

3.4 特殊角色PUBLIC

sql 复制代码
-- 授予PUBLIC权限(谨慎使用)
GRANT EXECUTE ON util.pkg_general TO PUBLIC;

-- 回收PUBLIC权限
REVOKE EXECUTE ON util.pkg_general FROM PUBLIC;

四、权限查询方法

4.1 查看用户系统权限

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

4.2 查看用户对象权限

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

4.3 查看列级权限

sql 复制代码
SELECT * FROM DBA_COL_PRIVS WHERE GRANTEE = 'USER1';

4.4 查看角色权限

sql 复制代码
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'SALES_ROLE';
相关推荐
杨DaB2 小时前
【SpringMVC】拦截器,实现小型登录验证
java·开发语言·后端·servlet·mvc
摸鱼仙人~3 小时前
Redis 数据结构全景解析
数据结构·数据库·redis
t198751285 小时前
解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题
数据库·mysql·adb
大佐不会说日语~8 小时前
Redis高频问题全解析
java·数据库·redis
会飞的灰大狼8 小时前
初识数据库
数据库
努力的小雨8 小时前
还在为调试提示词头疼?一个案例教你轻松上手!
后端
魔都吴所谓8 小时前
【go】语言的匿名变量如何定义与使用
开发语言·后端·golang
陈佬昔没带相机9 小时前
围观前后端对接的 TypeScript 最佳实践,我们缺什么?
前端·后端·api
旋风菠萝10 小时前
JVM易混淆名称
java·jvm·数据库·spring boot·redis·面试