甲骨文顶点 19.2 : Cannot resolve the "schema is reserved or restricted" issue

标签 oracle schema oracle-apex oracle19c

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

技术/环境细节如下:

数据库:本地机器上安装的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,为 VARCHAR 等保留字返回 TRUE。

当我可以创建具有相同权限的相同用户(不同的名称)时,我真的很震惊,对象和数据是在相同的表空间上创建的,并且它在 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'
);
...
...
...

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

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 来修复。

关于甲骨文顶点 19.2 : Cannot resolve the "schema is reserved or restricted" issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61369434/

相关文章:

.net - ODAC 11.2 Release 3 (11.2.0.2.1) 中的 ODP.NET 已经支持 Entity Framework (EF)?

sql - TOAD 脚本中的变量

mysql - 将架构(通过 .XSD 文件)导入 MySQL 数据库

SQL Schema 允许用户向各种表添加注释

Oracle Apex 4.1 如何创建 LOV 和文本字段的字段

oracle - ORA-24247: 发送电子邮件 oracle 时网络访问被访问控制列表 (ACL) 拒绝

database - 如何使用 SQL Developer 或 Apex 连接 Oracle

oracle - 如何在 Oracle 11g 系统上找到可用的目录对象?

XML Schema 具有不同类型的相同元素在不同序列中的选择导致类型错误

android - 如何使用java socket编程将android连接到oracle