Oracle Apex 19.2:无法解决“架构被保留或受限”问题

Posted

技术标签:

【中文标题】Oracle Apex 19.2:无法解决“架构被保留或受限”问题【英文标题】:Oracle Apex 19.2: Cannot resolve the "schema is reserved or restricted" issue 【发布时间】:2020-08-05 17:28:41 【问题描述】:

我尝试使用名为 PEOPLE 的现有架构在 APEX 中创建工作区,但它给出了错误消息 “架构已保留或受限”。我尝试使用我创建的其他现有架构,它们都运行良好。

技术/环境细节如下:

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

创建了名为PDB1的可插拔数据库。 使用 OMF(Oracle 托管文件)语法创建了表空间 PEOPLE_TAB。 在 PDB1 中创建了本地用户 PEOPLE

PEOPLE以下角色和权限(我知道有些是加倍的,比如 RESOURCE 角色和 CREATE SESSION priv):

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,为 VARCHAR 等保留字返回 TRUE。

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

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

谢谢。

【问题讨论】:

你能负担得起删除 PEOPLE 用户并重新创建它,并使用它现在拥有的所有权限、表......一切(就像你对那个“相同”用户所做的那样)吗? @Littlefoot 我可以,但是如果在生产环境中发生这种情况,可能无法选择删除和​​重新创建,我真的很想为此找到解决方案。它所需要的只是某种方式来解除 PEOPLE 模式的限制,但我已经用尽了我所知道的途径。 对;这就是我问这个问题的原因。如果没有其他方法,也许 DROP + CREATE 可以完成这项工作。 我显然在这里错过了一个技巧,因为在这种情况下必须有一种方法可以取消对架构的限制。 如果您找到原因/答案/解决方案,请在此处发布。我真的很好奇。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您收到错误是因为 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),您将无法使用架构名称 PEOPLE 创建 APEX 工作区。这需要 Oracle 通过软件包补丁或更新版本的 APEX 来修复。

【讨论】:

非常感谢!这已经解释了这个问题。

以上是关于Oracle Apex 19.2:无法解决“架构被保留或受限”问题的主要内容,如果未能解决你的问题,请参考以下文章

在对应用程序进行更改时,Oracle SQL Developer 19.2 版和 Oracle APEX 4.2 版是不是会相互支持?

Oracle APEX - 模板“卡片”中卡片之间的空间

如何使用/不使用基础数据库表制作表格 - APEX 19.2

如何在 apex 19.2 中使用数据库中的表

Oracle Apex 日期选择器行为异常

如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?