惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
N
Netflix TechBlog - Medium
博客园 - 聂微东
Y
Y Combinator Blog
罗磊的独立博客
博客园_首页
小众软件
小众软件
有赞技术团队
有赞技术团队
爱范儿
爱范儿
F
Fortinet All Blogs
C
Check Point Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏

博客园 - AlfredZhao

执行新项目 python 脚本前,先用 conda 建一个独立环境 Git 提交代码:从报错到 SSH 免密推送 GitHub 克隆他人私有仓库:从授权到下载 理解Oracle Property Graph:以账户转账示例完成图特性最小测试 APEX 无法分配 SH 用户?一个存储过程轻松解决 SH 中文化样例数据使用手册 Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL 进程都杀了,为什么 `netstat` 还能看到端口? MAC 空间告急?Codex 的 156GB 缓存垃圾,这样清! 人工清理问题数据:先查准,再删除 TK(Trusted Knowledge)为何而生? 使用快捷键快速切换 Mac 外接显示器模式 客户环境 Nginx 配置:流式报表与超时排查要点 Security Central:数据库安全的统一控制与运营平台 Palantir 眼中的一次“订单可能延期”,如何成为实时决策的起点? 从一条订单消息到 Bronze、Silver、Gold:我的第一次 Kafka + Lakehouse 实验 UUID v4 与 v7:同样是唯一 ID,为什么数据库表现可能完全不同? 用 crontab 给 LLM 使用量装上“监控眼” DeepSeek 与 GPT API 价格调整:该关注什么? 查看 Oracle 数据库中的定时任务执行情况 Codex 专用用户登录后自动进入默认项目目录 Mac 小技巧:用方向键优雅处理超长网址 Oracle GDD 与 Raft:别把共识机制和数据主权混为一谈 在 Oracle APEX 中用 BGE_BASE 生成向量:从模型导入到历史数据更新 行业人+AI:真正有价值的四个关键要素 知识库文件解析失败:一次由 Domain Index 引发的定位记录 Unicode 码位数、UTF-8 字节数、中英文差异和 Oracle 长度别再混淆了 Skill 的使用:从路径到能力边界 切换 Embedding 模型时,千万别忽略历史向量维度 kbot 适配 GPT-5.6:一次参数兼容性排查
Oracle Deep Data Security (Deep Sec) 初体验
AlfredZhao · 2026-05-13 · via 博客园 - AlfredZhao

关于数据安全,之前介绍过的 Oracle RAS 虽然强大,但规则定义还是太复杂,如今 Oracle 推出的 Deep Data Security (Deep Sec) 重新定义了AI智能体时代的数据安全玩法,不但继承了RAS的核心功能,而且其提供的直接使用声明式SQL来配置的方法,也让AI时代的数据安全从此变得既简单又可控。

01 | 前提条件:Oracle AI Database 需升级到23.26.2

因为 Deep Sec 是在 23.26.2 引入的新功能,所以软件版本要求 Oracle AI Database (23.26.2 or later),目前这个RU已经可以在MOS下载到了。

笔者目前的测试环境还是23.26.1,所以需要下载应用这个补丁:

  • Patch 39093711: DATABASE RELEASE UPDATE 23.26.2.0.0

注意:readme中建议用于应用补丁的opatch建议在12.2.0.1.49或以上,执行下面命令查询opatch版本,如果你的opatch版本也不符合要求,可以通过搜索 6880880 下载最新的opatch版本。

$ $ORACLE_HOME/OPatch/opatch version

笔者的opatch版本不满足需求,所以选择下载最新的opatch版本:

OPatch比较小,下载后的文件名为:

  • p6880880_230000_Linux-x86-64.zip

然后我们更新opatch,再用新的opatch应用23.26.2的补丁,直接按照readme操作即可。考虑到如今AI时代下,数据库的使用者自身未必都有DBA经验,也未必能找到DBA帮忙,且这种基础环境的操作还是不太建议全权交给AI(因为不同版本补丁是可能有细微差异的,AI可能出错),最终需要真人来确认复核比较稳妥,所以这里列下笔者操作的关键命令参考,完整细节还是参考readme仔细核对:

首先,备份之前的OPatch,解压新的OPatch,确认已成功替换新的opatch版本,操作如下:

[oracle@alfred-aibs-db ~]$ cd $ORACLE_HOME
[oracle@alfred-aibs-db dbhome_1]$ mv OPatch OPatch_bak
[oracle@alfred-aibs-db dbhome_1]$ unzip /u01/media/p6880880_230000_Linux-x86-64.zip 
[oracle@alfred-aibs-db dbhome_1]$ $ORACLE_HOME/OPatch/opatch version
OPatch Version: 12.2.0.1.51

OPatch succeeded.

确认opatch版本已经是目前最新的 OPatch Version: 12.2.0.1.51。

然后使用这个opatch来应用补丁,按照补丁包中的readme说明操作即可,有些参数readme可能忘记标明了,手工根据实际情况,补上即可,笔者环境执行相关命令如下:

unzip p39093711_230000_Linux-x86-64.zip
cd 39093711
$ORACLE_HOME/OPatch/opatch prereq CheckMinimumOPatchVersion -ph /u01/media/39093711
$ORACLE_HOME/OPatch/opatch prereq CheckConflictAgainstOHWithDetail -phBaseDir /u01/media/39093711

确认这些预检查都正常验证通过:

笔者这里单实例,需要停止数据库和监听:

If this is not an Oracle RAC environment, shut down all instances and listeners associated with the Oracle home that you are updating. For more information, see Oracle AI Database Administrator's Guide.

[oracle@alfred-aibs-db 39093711]$ lsnrctl stop
[oracle@alfred-aibs-db 39093711]$ sqlplus / as sysdba
SQL> shutdown immediate;

确认正常关闭后,然后应用补丁:

$ cd /u01/media/39093711
$ $ORACLE_HOME/OPatch/opatch apply

碰到交互式确认的地方,选择y即可,基本都是问你是否确认执行,是否已关闭数据库并准备好打补丁了。

耐心等个几分钟,补丁就应用好了:

下一步继续按readme执行,启库,执行datapatch,这一过程又需要再等几分钟:

[oracle@alfred-aibs-db 39093711]$ sqlplus / as sysdba
SQL> startup
SQL> alter pluggable database all open;
SQL> quit
[oracle@alfred-aibs-db OPatch]$ ./datapatch -sanity_checks
[oracle@alfred-aibs-db OPatch]$ ./datapatch -verbose

执行完成后检查日志有无报错,可以跑下utlrp这个重新编译无效对象:

[oracle@alfred-aibs-db OPatch]$ export PATH=$PATH:$ORACLE_HOME/bin
[oracle@alfred-aibs-db OPatch]$ cd $ORACLE_HOME/rdbms/admin
[oracle@alfred-aibs-db admin]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -n 1 -e -b utlrp -d $ORACLE_HOME/rdbms/admin utlrp.sql

确认已升级成功23.26.2:

最后启动下监听,恢复对外服务。

[oracle@alfred-aibs-db admin]$ lsnrctl start

02 | 测试验证Deep Sec的功能效果

本文测试验证当没有IAM集成的场景下,如何利用 Local End User 配置 Deep Sec 的功能,并验证效果:

参考官方文档link:

① 构造最小示例数据

-- 笔者本次测试用到的PDB:orclpdb1
ALTER SESSION SET CONTAINER = orclpdb1;

-- Create the HR user
-- 注:这里是创建一个“没有密码、无法直接登录”的模式(Schema)用户 HR
CREATE USER hr NO AUTHENTICATION
  DEFAULT TABLESPACE users
  QUOTA UNLIMITED ON users;
 
-- Create the employees table
CREATE TABLE hr.employees (
    employee_id   NUMBER PRIMARY KEY,
    first_name    VARCHAR2(50),
    last_name     VARCHAR2(50),
    email         VARCHAR2(128),
    manager       VARCHAR2(128),
    ssn           VARCHAR2(20),
    salary        NUMBER(10,2),
    phone         VARCHAR2(20)
);

-- 插入示例数据
INSERT INTO hr.employees VALUES
  (100, 'Victoria', 'Williams', 'vwilliams',
   NULL, '219-09-9999', 13000, '555-0100');
 
INSERT INTO hr.employees VALUES
  (200, 'Marvin', 'Anderson', 'manderson',
   'vwilliams', '457-55-5462', 12030, '555-0200');
 
INSERT INTO hr.employees VALUES
  (300, 'Chris', 'Evans', 'cevans',
   'vwilliams', '321-12-4567', 6900, '555-0300');
 
INSERT INTO hr.employees VALUES
  (400, 'Emma', 'Baker', 'ebaker',
   'manderson', '733-02-9821', 8200, '555-0400');
 
INSERT INTO hr.employees VALUES
  (500, 'Taylor', 'Mills', 'tmills',
   'manderson', '558-76-1243', 9000, '555-0500');
 
COMMIT;

示例数据准备好是这样,全表只有5行数据,以方便读者更直观的看到演示效果:

② 创建Local End Users

注意这里的 End User 不是传统意义上的数据库用户。

CREATE END USER "manderson" IDENTIFIED BY "Test_20260513";
CREATE END USER "ebaker" IDENTIFIED BY "Test_20260513";

虽然上面的SQL是在数据库中执行,但其本质区别是这种 End User 用户并没有自己的schema,没有任何的数据库对象实体。只是用于细粒度数据访问:

They receive fine-grained data access through data grants assigned to their data roles.

当一个 End User 登录到数据库,

ORA_END_USER_CONTEXT.username returns their user name.
The data grants in this chapter use predicates that compare this value against the email and manager columns of the hr.employees table. For the predicates to match, the local end-user names you create must match the values stored in those columns.

③ 配置Data Roles

注意这里创建的 Data Role 目前只赋予了连接会话的权限:

-- Create data roles that are managed locally in the database
CREATE DATA ROLE employee_role;
CREATE DATA ROLE manager_role;
 
-- Create a standard database role for connection privileges
CREATE ROLE db_role;
GRANT CREATE SESSION TO db_role;
 
-- Grant the connection privileges to the data role used for direct logon
GRANT db_role TO employee_role;
GRANT db_role TO manager_role;

将上面创建好的 Data Role 再赋给对应的终端用户:
终端用户 manderson 拥有两个 Data Role
终端用户 ebaker 拥有一个 Data Role

-- Grant data roles to Marvin (manager and employee)
GRANT DATA ROLE manager_role TO "manderson";
GRANT DATA ROLE employee_role TO "manderson";
 
-- Grant the employee data role to Emma
GRANT DATA ROLE employee_role TO "ebaker";

④ 配置Data Access Control

这个是重头戏,关于数据访问授权的详细规则具体如何设定全都在这部分,之前的RAS就是各种调用复杂的内部定义,如今在 Deep Sec 中只需要声明式的SQL即可实现,具体定义的内容也容易让人理解。

Define data grants to control which rows and columns each end user can access. In data grant predicates, ORA_END_USER_CONTEXT.username returns the end user's name from the current end-user security context.

创建一个数据授权(Data Grant),允许员工仅查看他们自己的记录。

CREATE DATA GRANT hr.employees_own_record
  AS SELECT
  ON hr.employees
  WHERE email = ORA_END_USER_CONTEXT.username
  TO employee_role;

创建一个数据授权,允许经理查看其直系下属的记录(但不包括 SSN 字段)。

CREATE DATA GRANT hr.manager_direct_reports
  AS SELECT (ALL COLUMNS EXCEPT ssn)
  ON hr.employees
  WHERE manager = ORA_END_USER_CONTEXT.username
  TO manager_role;

⑤ 测试验证Deep Sec的效果

分别使用不同的 END USER 登录,验证Deep Sec实现的细粒度数据访问效果。

我们主要关注,不同 END USER 登录,ORA_END_USER_CONTEXT.username 值的变化,以及同样查询 hr.employees 的记录差异:

相同的测试SQL如下,方便直接拷贝:

SELECT ORA_END_USER_CONTEXT.username FROM dual;

SET LINESIZE 120
SET TRIMSPOOL ON
SET PAGESIZE 50

COL FIRST_NAME FORMAT A10
COL LAST_NAME  FORMAT A10
COL EMAIL      FORMAT A20
COL MANAGER    FORMAT A15
COL SSN        FORMAT A11
COL SALARY     FORMAT 99999.9
COL PHONE      FORMAT A12

SELECT * FROM hr.employees;

场景1:使用 manderson 终端用户登录测试:

sqlplus '"manderson"'/Test_20260513@//localhost:1521/ORCLPDB1

从场景1的结果可以看到, manderson 终端用户登录进来后,ORA_END_USER_CONTEXT.username 值是 manderson,查询员工表,能看到自己的记录,同时能看到所有下属的记录,但无法看到下属的SSN字段值。

场景2:使用 ebaker 终端用户登录测试:

sqlplus '"ebaker"'/Test_20260513@//localhost:1521/ORCLPDB1

从场景2的结果可以看到, ebaker 终端用户登录进来后,ORA_END_USER_CONTEXT.username 值是 ebaker,查询员工表,只能看到自己的记录。

符合我们之前的定义规则。

03 | 快速部署Deep Sec的方法

上面为了让用户能看清楚每一步都做了什么,是分步骤演示执行的。

如果用户已经了解Deep Sec的机制,想快速通过集成SQL脚本,一键部署或清理测试环境,官方也有提供示例脚本,可以直接使用或者根据自己实际情况修改。

A.1 Scripts for Direct Logon with Local End Users

至此,Oracle Deep Data Security (Deep Sec) 初体验已完成,后续有时间再具体看下如何将 Deep Sec 和 AI应用结合起来使用。