YashanDB 用户管理与权限控制

一、用户概述

在 YashanDB 中,用户(User)是访问和操作数据库的逻辑实体,每个用户都有自己的身份标识、密码、权限和默认表空间等属性。用户分为系统用户和普通用户:


1. 系统用户

系统用户是预置在数据库中的用户,例如`SYS`用户,拥有最高权限,负责数据库的管理和维护。


2. 普通用户

普通用户是通过`CREATE USER`语句创建的用户,用于日常的数据库操作和业务访问。

每个用户在数据库中对应一个模式(Schema),模式是数据库对象的集合,用于组织和归类用户创建的对象。模式名称默认与用户名相同,例如用户`sales`的模式名称也为`sales`。


二、用户管理


(一)创建用户


创建用户时,需要指定用户名、密码和默认表空间(可选)。默认表空间用于存储用户创建的对象,如表、索引等。


• 示例 1:创建用户`sales`,密码为`123456`,默认表空间为`USERS`。

  CREATE USER sales IDENTIFIED BY 123456;


 


• 示例 2:创建用户`sales01`,密码为`123456`,默认表空间为`others`。

  CREATE USER sales01 IDENTIFIED BY 123456 DEFAULT TABLESPACE others;

(二)修改用户


用户创建后,可以修改其密码、默认表空间或锁定/解锁用户账户。


• 示例 1:修改用户`sales`的密码为`sales`。

 ALTER USER sales IDENTIFIED BY sales;


• 示例 2:修改用户`sales`的默认表空间为`users`。

  ALTER USER sales DEFAULT TABLESPACE users;


• 示例 3:锁定用户`sales`。

  ALTER USER sales ACCOUNT LOCK;



• 示例 4:解锁用户`sales`。

  ALTER USER sales ACCOUNT UNLOCK;

(三)删除用户


删除用户时,可以选择是否同时删除该用户下的所有数据库对象。如果用户下有对象且未指定`CASCADE`选项,则删除操作会失败。


• 示例 1:删除用户`sales`,但不删除其下的对象。

  DROP USER sales;


• 示例 2:删除用户`sales`及其下所有对象。

  DROP USER sales CASCADE;


 


• 注意:处于登录状态的用户无法被删除。


---

三、权限概述

权限是数据库中用于控制用户操作和访问的机制,分为系统权限和对象权限:


1. 系统权限

系统权限允许用户执行数据库级别的操作,例如登录数据库、创建用户、修改系统参数等。系统权限的范围较广,需谨慎授予。


2. 对象权限

对象权限允许用户对特定数据库对象(如表、视图、索引等)执行特定操作,例如查询、插入、更新或删除数据。对象权限的范围更细粒度,便于控制用户对具体对象的访问。


四、权限的授予和收回


(一)系统权限的授予


授予系统权限时,授权者需要满足以下条件之一:

• 拥有该系统权限且带有`ADMIN OPTION`。

• 拥有`GRANT ANY PRIVILEGE`系统权限。

• 数据库未开启三权分立,授权者拥有`DBA`角色。

• 数据库开启三权分立,授权者拥有`SECURITY_ADMIN`角色。


• 示例 1:授予用户`sales`查询所有表的权限。

  GRANT SELECT ANY TABLE TO sales;


• 示例 2:授予用户`sales`查询所有表的权限,并允许其传递该权限。

  GRANT SELECT ANY TABLE TO sales WITH ADMIN OPTION;


  

(二)对象权限的授予


授予对象权限时,授权者需要满足以下条件之一:

• 是该对象的所有者。

• 拥有该对象权限且带有`GRANT OPTION`。

• 拥有`GRANT ANY OBJECT PRIVILEGE`系统权限。

• 数据库未开启三权分立,授权者拥有`DBA`角色。

• 数据库开启三权分立,授权者拥有`SECURITY_ADMIN`角色。


• 示例 1:授予用户`sales01`查询用户`sales`下的`area`表的权限。

  GRANT SELECT ON sales.area TO sales01;


 


• 示例 2:授予用户`sales01`查询用户`sales`下的`area`表的权限,并允许其传递该权限。

  GRANT SELECT ON sales.area TO sales01 WITH GRANT OPTION;


 

(三)权限的收回


权限收回后立即生效,需谨慎操作以免影响业务运行。


• 示例 1:收回用户`sales`查询所有表的权限。

  REVOKE SELECT ANY TABLE FROM sales;


 


• 示例 2:收回用户`sales01`查询用户`sales`下的`area`表的权限。

  REVOKE SELECT ON sales.area FROM sales01;


 

---

五、角色概述

角色是用于管理一组权限集合的逻辑对象,通过角色可以简化权限管理。角色分为内置角色和自定义角色:


1. 内置角色

内置角色是数据库预定义的角色,具有特定的权限集合。例如:

• `DBA`:拥有几乎所有的数据库权限(在三权分立模式下不包括审计和安全管理权限)。

• `AUDIT_ADMIN`:管理审计策略的权限。

• `SECURITY_ADMIN`:管理用户、角色和权限的权限。

• `PUBLIC`:所有用户默认拥有的角色,谨慎对其授权以免引发安全风险。


2. 自定义角色

自定义角色可以根据业务需求创建,用于管理特定的权限集合。


角色的使用限制

• 角色可以授予用户,但不能授予其他角色。

• 数据库用户和角色不能同名。

• 授予用户角色后,权限对新连接的会话生效。


---

六、自定义角色的管理


(一)创建角色


创建自定义角色时,只需指定角色名称。


• 示例:创建角色`role1`。

  CREATE ROLE role1;


 

(二)给角色授权


可以将系统权限或对象权限授予角色。


• 示例 1:授予角色`role1`查询所有表的权限。

  GRANT SELECT ANY TABLE TO role1;


 


• 示例 2:授予角色`role1`插入用户`sales`下的`area`表的权限。

  GRANT INSERT ON sales.area TO role1;


 


• 注意:不能使用`WITH ADMIN OPTION`或`WITH GRANT OPTION`授权给角色。


(三)将角色授予用户


将角色授予用户后,用户会立即获得该角色的所有权限。


• 示例:将角色`role1`授予用户`sales`。

  GRANT role1 TO sales;


• 注意:角色授予用户后,仅对新连接的会话生效。

(四)删除角色


删除角色时,会同时删除该角色的所有授权记录。


• 示例:删除角色`role1`。

  DROP ROLE role1;


 


• 注意:禁止删除内置角色。删除自定义角色后,拥有该角色的用户会延时失去权限,需谨慎操作以免影响业务运行。


---

七、相关视图

YashanDB 提供了多个系统视图,用于查询用户、角色和权限的相关信息:


1. DBA_USERS

显示数据库中所有用户的信息。

   SELECT username, account_status, created FROM dba_users;


 

2. DBA_ROLES

显示数据库中所有角色的信息。

   SELECT * FROM dba_roles WHERE SYS_MAINTAINED = 'NO'; -- 查询自定义角色


 

3. DBA_ROLE_PRIVS

显示角色的授权信息。

   SELECT * FROM dba_role_privs WHERE grantee = 'ROLE1';


 

4. DBA_SYS_PRIVS

显示所有系统权限的授权信息。

   SELECT * FROM dba_sys_privs WHERE grantee = 'SALES';


 

5. DBA_TAB_PRIVS

显示所有对象权限的授权信息。

   SELECT owner, table_name, privilege FROM dba_tab_privs WHERE