Oracle 19c入门学习教程,从入门到精通,Oracle 用户管理与权限分配 —— 语法详解与实战案例(13)

Oracle 用户管理与权限分配 ------ 语法详解与实战案例


一、环境准备:Oracle 安装简要说明(以 Oracle Database 21c Express Edition 为例)

注意:本章节重点为用户与权限管理,安装过程仅作必要引导。

1. 安装 Oracle Database 21c XE(Windows/Linux)

Windows 安装步骤简述:
  1. 下载 Oracle Database 21c XE 安装包(官网链接
  2. 以管理员身份运行 setup.exe
  3. 选择安装类型:Desktop Class (单机开发)或 Server Class
  4. 设置数据库口令(用于 SYS、SYSTEM 等内置账户)
  5. 完成安装后,默认监听端口为 1521,服务名为 XE
Linux(Ubuntu/CentOS)安装简述:
bash 复制代码
# 示例:Ubuntu 22.04
wget https://download.oracle.com/otn-pub/otn_software/db-express/oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
sudo dnf install oracle-database-xe-21c-1.0-1.ol8.x86_64.rpm
sudo /etc/init.d/oracle-xe-21c configure

配置过程中设置 SYS/SYSTEM 密码。

安装完成后,使用 SQL*Plus 或 SQL Developer 连接数据库:

bash 复制代码
sqlplus sys/your_password@localhost:1521/XE as sysdba

二、核心语法知识点详解与案例


1. 用户与模式(Schema)的关系

  • 用户(User):数据库中的账户,用于身份验证。
  • 模式(Schema):用户拥有的数据库对象(表、视图、索引等)的集合。
  • 关系:每个用户自动拥有一个同名的模式。创建用户即创建同名模式。

✅ 用户 ≠ 模式,但默认一一对应。


2. 创建用户

语法:
sql 复制代码
CREATE USER username
IDENTIFIED BY password
[DEFAULT TABLESPACE tablespace_name]
[TEMPORARY TABLESPACE temp_tablespace]
[PROFILE profile_name]
[ACCOUNT {LOCK | UNLOCK}];
案例:
sql 复制代码
-- 创建用户 scott,密码为 tiger
-- 默认表空间为 USERS,临时表空间为 TEMP
CREATE USER scott
IDENTIFIED BY tiger
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
ACCOUNT UNLOCK;

🔒 注意:普通用户无权创建用户,需具有 CREATE USER 系统权限(通常由 DBA 执行)。


3. 修改用户

语法:
sql 复制代码
ALTER USER username
[IDENTIFIED BY new_password]
[DEFAULT TABLESPACE tablespace_name]
[TEMPORARY TABLESPACE temp_tablespace]
[PROFILE profile_name]
[ACCOUNT {LOCK | UNLOCK}];
案例:
sql 复制代码
-- 修改 scott 密码并锁定账户
ALTER USER scott IDENTIFIED BY newpass ACCOUNT LOCK;

-- 解锁账户
ALTER USER scott ACCOUNT UNLOCK;

4. 删除用户

语法:
sql 复制代码
DROP USER username [CASCADE];
  • CASCADE:级联删除该用户拥有的所有对象(如表、视图等)。
  • 若用户拥有对象但未加 CASCADE,则删除失败。
案例:
sql 复制代码
-- 删除用户及其所有对象
DROP USER scott CASCADE;

5. 权限简介

  • 系统权限(System Privileges) :对整个数据库的操作权限,如 CREATE SESSION, CREATE TABLE
  • 对象权限(Object Privileges) :对特定对象的操作权限,如 SELECT ON emp, UPDATE ON dept

6. 授权操作(GRANT)

6.1 系统权限授权
sql 复制代码
GRANT privilege [, privilege...] TO user_or_role;
案例:
sql 复制代码
-- 授予 scott 登录和建表权限
GRANT CREATE SESSION, CREATE TABLE TO scott;
6.2 对象权限授权
sql 复制代码
GRANT object_privilege [(column_list)]
ON [schema.]object
TO user_or_role
[WITH GRANT OPTION];
案例:
sql 复制代码
-- 假设 hr 用户有 employees 表
-- 授予 scott 查询 hr.employees 的权限,并允许其转授
GRANT SELECT ON hr.employees TO scott WITH GRANT OPTION;

⚠️ WITH GRANT OPTION 允许被授权者将权限再授予他人。


7. 撤销权限(REVOKE)

7.1 撤销系统权限
sql 复制代码
REVOKE privilege FROM user_or_role;
案例:
sql 复制代码
REVOKE CREATE TABLE FROM scott;
7.2 撤销对象权限
sql 复制代码
REVOKE object_privilege ON [schema.]object FROM user_or_role;
案例:
sql 复制代码
REVOKE SELECT ON hr.employees FROM scott;

🔁 撤销权限会级联生效(即使通过 WITH GRANT OPTION 转授的也会失效)。


8. 查询用户与权限

常用数据字典视图:
视图 说明
DBA_USERS 所有用户信息(需 DBA 权限)
USER_USERS 当前用户信息
DBA_SYS_PRIVS 系统权限分配
DBA_TAB_PRIVS 对象权限分配
USER_SYS_PRIVS 当前用户的系统权限
USER_TAB_PRIVS 当前用户的对象权限
案例查询:
sql 复制代码
-- 查看 scott 用户的系统权限
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'SCOTT';

-- 查看谁可以访问 hr.employees 表
SELECT GRANTEE, PRIVILEGE 
FROM DBA_TAB_PRIVS 
WHERE OWNER = 'HR' AND TABLE_NAME = 'EMPLOYEES';

9. 角色管理

9.1 角色简介
  • 角色是一组权限的集合,可简化权限管理。
  • 用户可被授予多个角色,角色也可被授予其他角色(避免循环)。
9.2 预定义角色
  • CONNECT:基本连接权限(含 CREATE SESSION
  • RESOURCE:开发常用权限(含 CREATE TABLE, CREATE SEQUENCE 等)
  • DBA:全部系统权限(谨慎使用!)

💡 Oracle 12c+ 中,CONNECTRESOURCE 已精简,建议显式授权。

9.3 创建角色与授权
语法:
sql 复制代码
CREATE ROLE role_name [NOT IDENTIFIED | IDENTIFIED BY password];
案例:
sql 复制代码
-- 创建开发角色
CREATE ROLE dev_role;

-- 授予角色权限
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO dev_role;

-- 将角色授予用户
GRANT dev_role TO scott;

🔐 IDENTIFIED BY password 表示角色需密码激活(较少用)。

9.4 管理角色
sql 复制代码
-- 启用/禁用角色(会话级)
SET ROLE dev_role;          -- 启用
SET ROLE NONE;              -- 禁用所有角色(除 DEFAULT)

-- 设置默认角色(登录自动启用)
ALTER USER scott DEFAULT ROLE dev_role;

-- 删除角色
DROP ROLE dev_role;
9.5 查询角色与权限
sql 复制代码
-- 用户拥有的角色
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'SCOTT';

-- 角色包含的系统权限
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'DEV_ROLE';

-- 角色包含的对象权限
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'DEV_ROLE';

10. 资源配置 PROFILE

10.1 PROFILE 简介
  • 用于限制用户资源使用和密码策略。
  • 每个用户只能关联一个 PROFILE。
10.2 使用 PROFILE 管理密码

常见参数:

  • FAILED_LOGIN_ATTEMPTS:失败登录次数限制
  • PASSWORD_LOCK_TIME:锁定时间(天)
  • PASSWORD_LIFE_TIME:密码有效期(天)
  • PASSWORD_REUSE_TIME:密码重用间隔
案例:创建安全 PROFILE
sql 复制代码
CREATE PROFILE secure_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 3
  PASSWORD_LOCK_TIME 1
  PASSWORD_LIFE_TIME 90
  PASSWORD_REUSE_TIME 365;
10.3 使用 PROFILE 管理资源

常见参数:

  • SESSIONS_PER_USER:并发会话数
  • CPU_PER_SESSION:CPU 秒数/会话
  • CONNECT_TIME:连接总时长(分钟)
  • IDLE_TIME:空闲超时(分钟)
案例:
sql 复制代码
ALTER PROFILE secure_profile LIMIT
  SESSIONS_PER_USER 2
  CPU_PER_SESSION 3600
  IDLE_TIME 30;
10.4 维护 PROFILE
sql 复制代码
-- 将 PROFILE 分配给用户
ALTER USER scott PROFILE secure_profile;

-- 修改现有 PROFILE
ALTER PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 5;

-- 删除 PROFILE(不能删除正在使用的)
DROP PROFILE secure_profile;
10.5 显示 PROFILE 信息
sql 复制代码
-- 查看所有 PROFILE 限制
SELECT * FROM DBA_PROFILES WHERE PROFILE = 'SECURE_PROFILE';

-- 查看用户使用的 PROFILE
SELECT USERNAME, PROFILE FROM DBA_USERS WHERE USERNAME = 'SCOTT';

三、综合性实战案例

场景:为一家公司搭建开发与测试环境

目标:
  1. 创建开发人员用户 dev1dev2
  2. 创建测试人员用户 tester1
  3. 设置角色:developer_roletester_role
  4. 应用安全 PROFILE
  5. 授权访问 HR 模式下的表

步骤代码(以 SYSDBA 身份执行):

sql 复制代码
-- 1. 创建安全 PROFILE
CREATE PROFILE app_user_profile LIMIT
  FAILED_LOGIN_ATTEMPTS 3
  PASSWORD_LOCK_TIME 1
  PASSWORD_LIFE_TIME 60
  SESSIONS_PER_USER 2
  IDLE_TIME 20;

-- 2. 创建角色
CREATE ROLE developer_role;
CREATE ROLE tester_role;

-- 3. 授予角色权限
-- 开发者:可建表、查 HR 数据、建视图
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO developer_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO developer_role;
GRANT SELECT ON hr.departments TO developer_role;

-- 测试者:只读 HR 数据
GRANT CREATE SESSION TO tester_role;
GRANT SELECT ON hr.employees TO tester_role;
GRANT SELECT ON hr.departments TO tester_role;

-- 4. 创建用户
CREATE USER dev1 IDENTIFIED BY DevPass123 PROFILE app_user_profile;
CREATE USER dev2 IDENTIFIED BY DevPass456 PROFILE app_user_profile;
CREATE USER tester1 IDENTIFIED BY TestPass789 PROFILE app_user_profile;

-- 5. 授予角色
GRANT developer_role TO dev1, dev2;
GRANT tester_role TO tester1;

-- 6. 设置默认角色(登录自动激活)
ALTER USER dev1 DEFAULT ROLE developer_role;
ALTER USER dev2 DEFAULT ROLE developer_role;
ALTER USER tester1 DEFAULT ROLE tester_role;

-- 7. 验证
SELECT GRANTEE, GRANTED_ROLE FROM DBA_ROLE_PRIVS 
WHERE GRANTEE IN ('DEV1', 'DEV2', 'TESTER1');

用户登录后操作示例(以 dev1 为例):

sql 复制代码
-- 连接数据库
-- sqlplus dev1/DevPass123@localhost:1521/XE

-- 创建自己的表
CREATE TABLE my_projects (id NUMBER, name VARCHAR2(100));

-- 查询 HR 数据
SELECT * FROM hr.employees WHERE department_id = 50;

-- 插入数据(因有 INSERT 权限)
INSERT INTO hr.employees (...) VALUES (...);

四、注意事项与最佳实践

  1. 最小权限原则:只授予必要权限。
  2. 避免直接授权给用户:优先使用角色管理权限。
  3. 定期审计权限 :使用 DBA_SYS_PRIVSDBA_TAB_PRIVS 检查异常授权。
  4. PROFILE 是安全基线:强制密码策略和资源限制。
  5. 不要滥用 DBA 角色:开发/测试环境也应模拟生产权限模型。

✅ 本章内容覆盖 Oracle 用户、权限、角色、PROFILE 全生命周期管理,适用于 Oracle 12c/19c/21c。


如需进一步自动化脚本或与应用集成(如 JDBC 连接字符串配置),可继续扩展。

相关推荐
LYS_06182 小时前
寒假学习(6)(C语言6+模数电6)
c语言·学习·模数电基础
独泪了无痕2 小时前
SQL数据类型转换:CAST详解及实践
数据库·sql·oracle
DarkAthena2 小时前
【GaussDB】GaussDB506版本A模式中的date类型
数据库·gaussdb
●VON2 小时前
在 OpenHarmony 上打造智能 TodoList:基于 Flutter 的标签分类与动态过滤实践
学习·flutter·openharmony·布局·技术
想做后端的前端2 小时前
Redis中的Lua使用
数据库·redis·lua
小锋学长生活大爆炸2 小时前
【工具】免费的文本读写API
java·数据库·mysql
晓风残月淡2 小时前
mysql数据库完整备份恢复方案(二)
数据库·mysql·adb
好奇龙猫2 小时前
【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(7):复习】
学习
近津薪荼2 小时前
优选算法——双指针专题2(模拟)
c++·学习·算法