创建用户
-- 在 PDB 中操作
ALTER SESSION SET CONTAINER = FREEPDB1;
CREATE USER app_user
IDENTIFIED BY "App#2024Pwd" -- 11g 起口令默认区分大小写
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 500M ON users -- 允许在该表空间用 500MB
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 授予基本登录权限
GRANT CREATE SESSION TO app_user;
-- 允许建表
GRANT CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE PROCEDURE TO app_user;这一节的操作(CREATE USER / GRANT / ALTER USER)都需要以 DBA 身份执行,例如用 SYSTEM 或 SYSDBA 连接;普通用户跑会报 ORA-01031: insufficient privileges。
只作示例阅读:切换容器(需 SYSDBA)。请在独立学习数据库中练习。
系统权限与对象权限
- 系统权限数量很多,ANY 结尾的权限(如 SELECT ANY TABLE)非常危险,慎授
- 对象权限针对具体表/视图/过程,粒度更细
- WITH GRANT OPTION 会形成权限传播链,回收时要留意级联效应
-- app_user 在上一节已经建好,这里再补一个审计账号
CREATE USER audit_user IDENTIFIED BY "Audit#2024Pwd";
-- 系统权限:在数据库中「做什么」
GRANT CREATE SESSION, CREATE TABLE TO app_user;
GRANT SELECT ANY TABLE TO audit_user; -- 谨慎授予
-- 对象权限:对「某个具体对象」做什么
GRANT SELECT, INSERT, UPDATE ON hr.employees TO app_user;
GRANT SELECT ON hr.departments TO app_user;
-- 允许把权限再转授给别人
GRANT SELECT ON hr.employees TO app_user WITH GRANT OPTION;
-- 收回权限
REVOKE SELECT ON hr.employees FROM app_user;只作示例阅读:建/改用户、角色、表空间。请在独立学习数据库中练习。
角色:批量授权的正确方式
- Oracle 预置三个重要角色:CONNECT(基本连接)、RESOURCE(建对象)、DBA(全部权限)
- 生产环境不要直接给 DBA,应该按职责定义细粒度角色
- 角色默认是 DEFAULT ROLE,禁用后需要显式 SET ROLE 才生效
-- 建角色
CREATE ROLE role_readonly;
CREATE ROLE role_developer;
-- 给角色授权
GRANT CREATE SESSION TO role_readonly;
GRANT SELECT ON hr.employees TO role_readonly;
GRANT SELECT ON hr.departments TO role_readonly;
GRANT role_readonly TO role_developer;
GRANT CREATE TABLE, CREATE VIEW TO role_developer;
-- 把角色分配给用户
GRANT role_readonly TO audit_user;
GRANT role_developer TO app_user;
-- 查看用户拥有的角色
SELECT granted_role, admin_option, default_role
FROM dba_role_privs WHERE grantee = 'APP_USER';只作示例阅读:建/改用户、角色、表空间。请在独立学习数据库中练习。
权限查询与审计
-- 当前用户被授予的系统权限
SELECT privilege FROM user_sys_privs ORDER BY privilege;
-- 当前用户对别人对象的权限
SELECT owner, table_name, privilege
FROM user_tab_privs
ORDER BY owner, table_name;
-- DBA 视角:查所有用户
SELECT username, account_status, default_tablespace, created
FROM dba_users
ORDER BY created DESC;
-- 解锁与改口令
ALTER USER app_user ACCOUNT UNLOCK;
ALTER USER app_user IDENTIFIED BY "NewPwd#2024";只作示例阅读:读取全库字典或会话(沙箱只开放自身对象)。请在独立学习数据库中练习。