3

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

技术/环境细节如下:

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

创建了名为PDB1的可插拔数据库。使用 OMF(Oracle 托管文件)语法
创建表空间PEOPLE_TAB 。PDB1
中 创建了本地用户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 管理指南第 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 有一个错误,但我检查了这个,它运行正常,返回 FALSEPEOPLE返回 FALSE,为保留字(如 VARCHAR)返回 TRUE。

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

有没有人有解决这个问题的经验或指出我正确的方向?

谢谢你。

4

2 回答 2

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

于 2020-10-30T17:36:36.407 回答
1

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

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

于 2020-04-26T23:57:42.243 回答