粮草机器人 APEX 是 Oracle Application Express(Oracle 的快速 Web 应用开发平台)
这里说的 APEX 是 Oracle Application Express(Oracle 的快速 Web 应用开发平台),SH 则是 Oracle 自带的 Sales History 示例 Schema。这个问题的根源不是配置错误,而是 APEX 的一道默认安全机制。
问题现象
在 APEX 管理后台,通过 Manage Workspaces → Manage Workspace to Schema Assignments → Add Schema 给工作区分配已存在的 Schema 时,下拉候选列表里找不到 SH 用户——尽管 SH 在数据库里是真实存在的[citation:web:3.4]。
根本原因
APEX 出于安全考虑,默认只允许工作区访问部分受控的 Schema。对于 SH 这类「没有在 APEX 中显式注册」的用户,它会被直接隐藏,必须由管理员手动把它加进「例外名单」才能被分配[citation:web:3.4]。
Oracle 官方对此提供了专门的过程:APEXINSTANCEADMIN.CREATESCHEMAEXCEPTION,作用就是「创建一个例外,允许将受限 Schema 分配给指定工作区」[citation:web:3.7][citation:web:3.14]。
解决方案:一个存储过程搞定
用 SYS 用户登录,执行下面的匿名块(把 SH 绑定到目标工作区,例如 WS_ALFRED):
SQL> show user
USER is "SYS"
SQL> BEGIN
2 APEXINSTANCEADMIN.CREATESCHEMAEXCEPTION(
3 p_schema => 'SH',
4 pworkspace => 'WSALFRED'
5 );
6 COMMIT;
7 END;
8 /
PL/SQL procedure successfully completed.
执行成功后,回到 Add Schema 页面,SH 就会出现在候选下拉列表中,正常勾选添加即可,随后就能在 Object Browser 里访问和管理 SH 下的业务数据了[citation:web:3.4]。
相关 API(配套掌握)
| 过程 | 作用 |
|------|------|
| APEXINSTANCEADMIN.CREATESCHEMAEXCEPTION | 创建例外,允许把受限 Schema 分配给某工作区[citation:web:3.7] |
| APEXINSTANCEADMIN.REMOVESCHEMAEXCEPTION | 移除单个例外[citation:web:3.12] |
| APEXINSTANCEADMIN.REMOVEWORKSPACEEXCEPTIONS | 移除某工作区的全部例外[citation:web:3.13] |
移除的写法同理:
BEGIN
APEXINSTANCEADMIN.REMOVESCHEMAEXCEPTION(
p_schema => 'SH',
pworkspace => 'WSALFRED'
);
COMMIT;
END;
/
注意事项
必须用 SYS 执行——APEXINSTANCEADMIN 包是 APEX 实例管理员专用,普通用户没有执行权限。
pworkspace 要写对工作区名(大小写敏感,通常是类似 WSALFRED 的内部名,不是显示名)。
这是一次例外授权,应谨慎使用:把受限 Schema 放开后,该工作区就能读写其全部数据,用完后记得用 REMOVESCHEMAEXCEPTION 收回[citation:web:3.4]。
---
一句话总结:SH 用户不是丢了,是被 APEX 默认安全策略挡在了候选列表外;用 SYS 跑一条 CREATESCHEMAEXCEPTION 给它开个例外,问题即解。
<< 上一篇