Oracle Apex 19.2:无法解决 "schema is reserved or restricted" 问题

Oracle Apex 19.2: Cannot resolve the "schema is reserved or restricted" issue

我尝试使用名为 PEOPLE 的现有架构在 APEX 中创建工作区,但它给出了错误消息 "The schema is reserved or restricted" .我尝试使用我创建的其他现有模式,它们都运行良好。

Technical/Environment详情如下:

数据库:本地计算机上安装的 Oracle 19c EE。
Apex:19.2 作为嵌入式网关安装在本地机器上。

已创建名为 PDB1 的可插入数据库。
使用 OMF(Oracle 管理的文件)语法创建表空间 PEOPLE_TAB
PDB1.

中创建本地用户 PEOPLE

PEOPLE 授予以下角色和权限(我知道有些角色和权限加倍,例如 RESOURCE 角色和 CREATE SESSION 权限):

RESOURCE
UNLIMITED TABLESPACE
SELECT_CATALOG_ROLE
CREATE SESSION
CREATE TABLE
CREATE TYPE
CREATE CLUSTER
CREATE TRIGGER
CREATE PROCEDURE
CREATE SEQUENCE
CREATE VIEW
CREATE DIMENSION
CREATE JOB
CREATE SYNONYM 
CREATE DIMENSION
CREATE MATERIALIZED VIEW

我在同一个表空间 PEOPLE_TAB 中创建了另一个用户 TEST1,具有与 相同的权限PEOPLE 并重新创建了对象和数据。我可以使用这个新架构成功创建工作区!

搜索了网络,但大多数文章和帖子都引用了旧版本的 APEX,但我仍然尝试了以下内容。

我遵循了 Oracle 文档中给出的建议,Application Express Release 19.2 Adminstration Guide section 2.13

APEX 19.2 的 APEX 引擎架构是 APEX_190200。所以我解锁了 APEX_190200 并登录(更改密码后)到 运行 支票。

-- Checked if PEOPLE was a restricted schema
SELECT schema FROM APEX_190200.wwv_flow_restricted_schemas order by schema;

PEOPLE 未列出,我认为不受限制。因此,无论如何,我都按照文档中的详细说明尝试取消限制 PEOPLE

-- ran from APEX_190200
EXEC APEX_INSTANCE_ADMIN.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;

成功运行但没有解决问题。

在网上查看大部分信息都已过时,但还是试过了。

-- ran from APEX_190200
EXEC APEX_SITE_ADMIN_PRIVS.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;

上面没有 运行 并抱怨包不存在。我验证了在 user_objects 中寻找 APEX_SITE_ADMIN_PRIVS 时 - 它不在那里。

几年前,函数 wwv_flow_provision.IS_RESERVED 存在一个错误,但我检查了这个,它 运行 可以为 PEOPLE 返回 FALSE,为 返回 TRUE保留字,如 VARCHAR。

当我可以创建具有相同权限的相同用户(不同名称)时,我真的很震惊,对象和数据是在相同的表空间上创建的,并且它在 APEX 工作区中运行良好。

有没有人有解决此问题的经验或为我指明了正确的方向?

谢谢。

有趣的问题。受限架构在 APEX 供应代码中进行硬编码。这在很大程度上是一个遗留问题。

我们可以尝试在下一版本的 APEX 中修复此问题,但现在对您没有帮助。如果您提交 Oracle 支持服务请求,我将确保您获得此问题的修复(假设您使用的是受支持的 APEX 版本)。

您收到错误消息是因为 PEOPLE 被指定为带有 APEX 包的受限架构。

在 APEX 19.2 的安装脚本中,名为 f4050.sql 的文件在第 79 页(引发错误的页面)有一个页面验证,看起来像这个:

...
...
...
wwv_flow_api.create_page_validation(
 p_id=>wwv_flow_api.id(114752711027135415)
,p_validation_name=>'schema not reserved/restricted'
,p_validation_sequence=>80
,p_validation=>wwv_flow_string.join(wwv_flow_t_varchar2(
'wwv_flow_provision.schema_name_valid(',
'    p_schema            => :F4050_P79_SCHEMA,',
'    p_workspace_name    => :F4050_P27_COMPANY);'))
,p_validation_type=>'PLSQL_EXPRESSION'
,p_error_message=>'Schema is reserved or restricted'
,p_when_button_pressed=>wwv_flow_api.id(12559200978895311)
,p_error_display_location=>'INLINE_WITH_FIELD_AND_NOTIFICATION'
);
...
...
...

然后使用这样的过程块,您可以确定模式名称是否有效:

BEGIN
    IF apex_190200.wwv_flow_provision.schema_name_valid (p_schema           => 'PEOPLE',
                                                         p_workspace_name   => 'PEOPLE')
    THEN
        DBMS_OUTPUT.put_line ('Valid');
    ELSE
        DBMS_OUTPUT.put_line ('Invalid');
    END IF;
END;
/

然后通过解包这些包中的代码(工具可以很容易地在网上找到)。在该代码中,调用了另一个名为 WWV_FLOW_PROVISIONING.RESERVED_SCHEMA (P_SCHEMA => P_SCHEMA) 的函数。在该函数中,有如下代码:

    IF C_SCHEMA IN (
        'HTMLDB_PUBLIC_USER',
        'APEX_PUBLIC_USER',
        'PUBLIC_USER',
        'FLOWS_FILES',
        'SCHEDULER',
        'PEOPLE') THEN
        
        RETURN TRUE;
    END IF;

因此,如果不修改包 WWV_FLOW_PROVISIONING(我强烈推荐 AGAINST),您将无法使用架构名称 。这将需要由 Oracle 通过软件包补丁或更新版本的 APEX 来修复。