上篇介绍了AI时代下数据安全的重要性,本篇笔者将基于 Oracle 官方提供的 HR Demo,动手实践 Real Application Security(RAS)的全流程。帮助大家更直观的理解 RAS 的核心机制。
01 | 先搞清楚:什么是 Oracle RAS?
RAS(Real Application Security)是 Oracle 推出的安全框架,它允许你在数据库层面管理"应用用户"的权限,而不仅仅是"数据库用户"。
如果想了解更多RAS的说明和其在AI时代的必要性,可直接参考上篇文章《Oracle RAS:AI时代企业数据安全核心》。
02 | Demo 环境准备(官方脚本一步到位)
Oracle 官方提供了一系列脚本,你可以按顺序运行来快速完成整个 Demo:
hrdemo_setup.sql- 创建数据库角色(例如
DB_EMP) - 创建应用角色(如
employee、it_engineer、hr_representative) - 创建应用用户(如
DAUSTIN、SMAVRIS) - 创建安全类、安全策略和 ACL
- 将安全策略应用到
HR.EMPLOYEES表上
- 创建数据库角色(例如
hrdemo.sql- 运行演示脚本,直接使用应用用户登录数据库 查看 RAS 效果
hrdemo_session.sql- 使用 Session API 演示如何通过中间层管理 RAS 会话
hrdemo.java- Java 示例代码演示在应用层如何联合 RAS 查询数据
hrdemo_clean.sql- 清理所有 Demo 对象,回到最初状态
- 上述各脚本完整内容可直接参考官方文档:
我们只需按照顺序运行这些脚本,就是一个完整的 RAS 上手实践。
笔者自己测试时发现一些小问题,会在具体地方贴出来供大家参考,避免重复踩坑。
- 避坑1:RAS这套脚本执行前提是你的库中存在hr这个示例schema,很多小伙伴会发现自己新版本的Oracle下不再有示例schema,而且也没安装脚本,此时就需要单独下载 Sample Schemas,解压到任意目录(当然也可以遵循历史放到
$ORACLE_HOME/demo/schema下),然后切换成你的PDB下,执行其中的 HR 脚本@hr_install.sql。

- 避坑2:RAS这套脚本没有考虑多租户的情况,目前都是多租户环境,所以脚本中所有关于数据库连接的地方都需要修改
@pdb_service_name,并测试能连接到期望的PDB。此外,sys认证保留脚本中的密码认证模式,不要自作聪明的改成os认证模式,因为有些脚本会多次切换连接,比如当从sys切换到普通用户后,就无法再成功切回sys,连接会报错。
03 | 直连方式验证 RAS(hrdemo.sql)
① 为什么要看"直连效果"?
直连模式是最简单的验证方式,用它能证明:
- RAS 会在数据库层自动判断权限
- 不同应用用户即使登录同一模式,也会看到不同的数据结果
② DAUSTIN:IT 员工的权限表现
- 连接方式:
conn daustin/welcome1@alfred; - 角色:
employee+it_engineer - 结果:
- 能看到 IT 部门所有员工行
- 只有自己的 SALARY 可见
- 不能更新任何记录


这个结果证明:即便 DAUSTIN 是通过直接登录数据库看到表,他的权限依旧受 RAS 策略控制,而不是数据库权限控制。
- 避坑3:测试发现sample数据中employees这张表中压根就没有这两个用户,估计笔者用到的版本和写官方文档的人不一致,如果你也遇到这样的问题,别改RAS的示例脚本,笔者这里直接插入两条记录(需要注意,原表107条记录,插入后全表记录变成109条,要知晓这个变化,因为脚本中有标识对比表中记录数的地方,如果实在不想增加记录,也可以选择update两条原表记录)。
SQL
--IT
INSERT INTO employees VALUES
( 1001
, 'David'
, 'Austin'
, 'DAUSTIN'
, '1.590.555.0105'
, TO_DATE('01-01-2026', 'dd-MM-yyyy')
, 'IT_PROG'
, 4800
, NULL
, 103
, 60
);
--HR
INSERT INTO employees VALUES
( 1002
, 'Susan'
, 'Mavris'
, 'SMAVRIS'
, '1.515.555.0168'
, TO_DATE('01-01-2026', 'dd-MM-yyyy')
, 'HR_REP'
, 6500
, NULL
, 101
, 40
);
commit;
04 | HR 代表 SMAVRIS:全表全列权限
我们继续使用直连方式验证 RAS,这次换成SMAVRIS这个应用用户。
① 登录演示
conn smavris/welcome1@alfred;- 角色:
employee+hr_representative
② 查询效果
- 全表所有员工都能看到
- SALARY 列完整显示
- 可以更新任意一条记录

这个演示说明了:应用用户 SMAVRIS 拥有完整的表访问权限,并且 RAS 自动应用权限策略,而不是依赖她的数据库账号级权限来控制。
Tips:这里看到截图一定有小伙伴会觉得困惑,这个conn直连感觉上不就是数据库的用户吗?
其实不是的,上面使用的DAUSTIN、SMAVRIS都属于应用用户,并不是数据库传统用户,有疑惑可以看官方DEMO最开始RAS初始化脚本中,这两个用户的创建是通过sys.xs_principal.create_user来完成的。
05 | 中间层仿真:Session API(hrdemo_session.sql)
在现实业务中,我们通常不会让业务用户直接登录数据库,而是让中间层应用维护一个连接池。RAS 提供了 Session API 来支持这种场景:
① Session 是什么?
一个 RAS Session 表示业务用户在线的身份环境,它绑定真实的数据库连接,使后续 SQL 执行按照这个业务用户的安全策略执行。
② Session API 的执行顺序
- 使用 session 管理员账号(如
hr_session)创建 RAS 会话 - 将会话挂载到当前数据库连接(attach)
- 当做这个应用用户来执行 SQL
- 执行完成后 detach 并 destroy
- 下次再 attach 到其他库连接上也能继续保持业务上下文
③ Session API 结果验证
示例中验证:
- 当前 RAS 会话的用户名是
SMAVRIS(可通过xs_sys_context('xs$session','username')查询) - 会话启用角色时能看到全表
- 禁用
hr_representative角色后,只能看到自己的记录 - 重新启用后恢复权限

这个步骤说明了:一个数据库连接可以托管多个业务用户权限上下文,而不会互相干扰。
06 | Java 示例程序(hrdemo.java)
除了 SQL 脚本,Oracle 官方还提供了 Java Demo,用于演示如何在真实应用层联动 RAS:
- Dispatcher 负责创建和管理 RAS sessions
- Application 连接使用普通账号查询数据
- 代码层通过 RAS 提供的接口判断:
- 哪些列可见(如 SALARY 是否可见)
- 当前业务用户是否有某些 ACL 权限
这意味着应用程序不需要托管一堆数据库用户账号,只要统一使用一个连接账号,通过 RAS Session 管理就能识别不同的用户身份和权限。
- 避坑4:这里官方文档也没写执行java程序相关的步骤,笔者没有java工作经验,因此直接跟AI学习下,得到一些指导,跑通这部分测试,给同样困惑的小伙伴参考:
首先要跑这段java程序,至少需要 这两个 jar:
| Jar | 作用 |
|---|---|
ojdbc8.jar |
JDBC 驱动 |
xs.jar |
RAS Java API |
具体位置在:
- $ORACLE_HOME/jdbc/lib/ojdbc8.jar
- $ORACLE_HOME/rdbms/jlib/xs.jar
为了方便拷贝到同一个ras目录下,然后执行:
BASH
javac -cp ".:ojdbc8.jar:xs.jar" hrdemo.java
编译成功得到 hrdemo.class 文件后,执行java程序,注意要指定正确的数据库信息
BASH
java -cp ".:ojdbc8.jar:xs.jar" hrdemo jdbc:oracle:thin:@//localhost:1522/alfred

Tips:目前整个demo演示已完成,最后可以根据实际所需来选择是否通过 hrdemo_clean.sql 恢复到RAS实验前的环境,这里不再赘述。
07 | 后记
其实RAS按照这个DEMO执行是比较简单的,但是如果根据实际需求去修改脚本内容配置时,就会发现RAS这种命令行的配置方式,还是有些门槛的,比如DEMO中的第一个setup脚本,就包含了这5个部分,需要先捋清楚这些概念之间的关系,才能更好的对应上自己的需求进行个性化的修订。
-- 1. SETUP - User and Roles
-- 2. SETUP - Security class and ACL
-- 3. SETUP - Data security policy
-- 4. SETUP - Validate the objects we have set up.
-- 5. SETUP - Mid-Tier related configuration.