#三权分立
# 三权分立开关
YashanDB提供ENABLE_SEPARATE_DUTY参数控制三权分立开关,默认关闭,该参数需重启生效。
建议在建库前先规划确认是否使用三权分立模式,如需使用,则可在建库操作时一并开启,不建议反复切换权限模式。若建库时未开启,但后续确有需要开启,应该先对当前已有用户的权限集合进行清理归整再开启三权分立。
# 三权分立影响范围
三权分立是对数据库管理人员的职责划分,目的是使不同的管理职位行使不同角色各司其职,互相限制和监督,保障系统整体安全。因此,开启三权分立影响的是各管理用户的系统特权,普通用户以及用户下的对象特权不会受到影响。
例如,在默认情况下三权分立未开启,创建管理用户sales1并授予其DBA角色,创建普通用户sales2。在sales2下创建表area1、area2,且对sales1授予了查询area1的对象特权。
-- 作为DBA,sales1可以访问sales2下的任意表
CREATE USER sales1 IDENTIFIED BY "sales1";
CREATE USER sales2 IDENTIFIED BY "sales2";
GRANT dba TO sales1;
GRANT CONNECT TO sales2;
GRANT RESOURCE TO sales2;
conn sales2/sales2
CREATE TABLE area1(C1 INT);
INSERT INTO area1 VALUES(1);
CREATE TABLE area2(C2 INT);
INSERT INTO area2 VALUES(2);
GRANT SELECT ON area1 TO sales1;
conn sales1/sales1
SELECT C1 FROM sales2.area1;
C1
------------
1
SELECT C2 FROM sales2.area2;
C2
------------
2
当开启三权分立后,sales1的系统特权将发生变化,对于未被授权的对象area2不再能够访问,也无法执行系统特权的授权操作。
ALTER SYSTEM SET ENABLE_SEPARATE_DUTY=true SCOPE=SPFILE;
-- 重启数据库生效
conn sales1/sales1
SELECT C1 FROM sales2.area1;
C1
------------
1
SELECT C2 FROM sales2.area2;
[1:15]YAS-02012 table or view does not exist
GRANT CREATE TABLE TO sales2;
YAS-02213 insufficient privileges
对于sales2用户,其本身已拥有权限无任何变化,并可以将area2的查询权限授予sales1用户。
conn sales2/sales2
GRANT SELECT ON area2 TO sales1;
conn sales1/sales1
SELECT C2 FROM sales2.area2;
C2
------------
2