首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle Apex 19.2:无法解决“模式保留或限制”问题

Oracle Apex 19.2:无法解决“模式保留或限制”问题
EN

Stack Overflow用户
提问于 2020-04-22 15:51:43
回答 2查看 801关注 0票数 3

我试图使用一个名为PEOPLE的现有模式在APEX中创建一个工作区,它给出了错误消息“模式是保留的或限制的”。我尝试使用我创建的其他现有模式,它们都运行得很好。

技术/环境细节如下:

数据库:安装在本地计算机上的Oracle 19 c EE。

先端: 19.2作为嵌入式网关安装在本地机器上。

创建了名为PDB1的可插入数据库。

使用OMF ()语法创建表空间PEOPLE_TAB。

在PDB1中创建本地用户。

提供了以下角色和枢密院(我知道有些角色被加倍了,比如资源角色和创建会话优先级):

代码语言:javascript
复制
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中创建了另一个用户PEOPLE_TAB,与PEOPLE具有相同的privs,并重新创建了对象和数据。我可以使用这个新模式成功地创建一个工作区!

虽然大多数文章和帖子都引用了较早版本的APEX,但我仍然尝试了以下几种方法。

我遵循Oracle,申请速递第19.2版管理指南第2.13节中的建议

APEX19.2的APEX引擎模式是APEX_190200。因此,我解锁APEX_190200并登录(在更改密码之后)来运行检查。

代码语言:javascript
复制
-- Checked if PEOPLE was a restricted schema
SELECT schema FROM APEX_190200.wwv_flow_restricted_schemas order by schema;

人们没有被列入名单,我想这是不受限制的。所以我试着解除人们的限制,不管怎么说,就像文档中的细节一样。

代码语言:javascript
复制
-- ran from APEX_190200
EXEC APEX_INSTANCE_ADMIN.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;

成功运行,但没有解决问题。

在网上看,大部分信息都过时了,但无论如何都试过了。

代码语言:javascript
复制
-- ran from APEX_190200
EXEC APEX_SITE_ADMIN_PRIVS.UNRESTRICT_SCHEMA(p_schema => 'PEOPLE');
COMMIT;

上述程序没有运行,并抱怨程序包不存在。当我在user_objects中寻找user_objects时,我验证了这一点--它不在那里。

几年前,函数wwv_flow_provision.IS_RESERVED有一个bug,但是我检查了它,它运行了ok,为人返回FALSE,对于VARCHAR这样的保留词运行TRUE。

当我能够在相同的表空间上创建相同的特权、对象和数据的相同用户(不同的名称),并且在APEX工作空间中很好地工作时,我真的会抛出它。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-30 17:36:36

您正在接收此错误,因为PEOPLE被指定为带有APEX包的受限架构。

在APEX19.2的安装脚本中,名为f4050.sql的文件在第79页(引发错误的页面)上有一个页面验证,如下所示:

代码语言:javascript
复制
...
...
...
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'
);
...
...
...

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

代码语言:javascript
复制
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)的函数。在该函数中,有如下代码:

代码语言:javascript
复制
    IF C_SCHEMA IN (
        'HTMLDB_PUBLIC_USER',
        'APEX_PUBLIC_USER',
        'PUBLIC_USER',
        'FLOWS_FILES',
        'SCHEDULER',
        'PEOPLE') THEN
        
        RETURN TRUE;
    END IF;

因此,如果不修改包WWV_FLOW_PROVISIONING (我强烈建议使用针对的),您将无法创建带有模式名称PEOPLE的APEX工作区。这需要由Oracle通过对包的修补程序或更新版本的APEX来修复。

票数 2
EN

Stack Overflow用户

发布于 2020-04-26 23:57:42

引人入胜的话题。受限模式是在APEX提供代码中进行硬编码的。这在很大程度上是一个遗留问题。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61369434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档