粮草机器人 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 给它开个例外,问题即解。