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 来修复。
我尝试使用名为 PEOPLE 的现有架构在 APEX 中创建工作区,但它给出了错误消息 "The schema is reserved or restricted" .我尝试使用我创建的其他现有模式,它们都运行良好。
Technical/Environment详情如下:
数据库:本地计算机上安装的 Oracle 19c EE。
Apex:19.2 作为嵌入式网关安装在本地机器上。
已创建名为 PDB1 的可插入数据库。
使用 OMF(Oracle 管理的文件)语法创建表空间 PEOPLE_TAB。
在 PDB1.
为 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 来修复。