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 未列出,我认为不受限制。因此,我尝试按照文档中的详细说明解除对
-- 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 版是不是会相互支持?
如何使用/不使用基础数据库表制作表格 - APEX 19.2
如何解决 Oracle Apex 中的“无法使用 DISTINCT、GROUP BY 等从视图中选择 FOR UPDATE”错误?