一、达梦数据库权限分类
达梦数据库的权限体系分为系统权限和对象权限两大类。
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';