我试图使用一个名为PEOPLE的现有模式在APEX中创建一个工作区,它给出了错误消息“模式是保留的或限制的”。我尝试使用我创建的其他现有模式,它们都运行得很好。
技术/环境细节如下:
数据库:安装在本地计算机上的Oracle 19 c EE。
先端: 19.2作为嵌入式网关安装在本地机器上。
创建了名为PDB1的可插入数据库。
使用OMF ()语法创建表空间PEOPLE_TAB。
在PDB1中创建本地用户。
提供了以下角色和枢密院(我知道有些角色被加倍了,比如资源角色和创建会话优先级):
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并登录(在更改密码之后)来运行检查。
-- Checked if PEOPLE was a restricted schema
SELECT schema FROM APEX_190200.wwv_flow_restricted_schemas order by schema;人们没有被列入名单,我想这是不受限制的。所以我试着解除人们的限制,不管怎么说,就像文档中的细节一样。
-- 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中寻找user_objects时,我验证了这一点--它不在那里。
几年前,函数wwv_flow_provision.IS_RESERVED有一个bug,但是我检查了它,它运行了ok,为人返回FALSE,对于VARCHAR这样的保留词运行TRUE。
当我能够在相同的表空间上创建相同的特权、对象和数据的相同用户(不同的名称),并且在APEX工作空间中很好地工作时,我真的会抛出它。
有没有人有解决这一问题的经验或指出我的正确方向?
谢谢。
发布于 2020-10-30 17:36:36
您正在接收此错误,因为PEOPLE被指定为带有APEX包的受限架构。
在APEX19.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 (我强烈建议使用针对的),您将无法创建带有模式名称PEOPLE的APEX工作区。这需要由Oracle通过对包的修补程序或更新版本的APEX来修复。
发布于 2020-04-26 23:57:42
引人入胜的话题。受限模式是在APEX提供代码中进行硬编码的。这在很大程度上是一个遗留问题。
我们可以尝试在下一个版本的APEX中修复这个问题,但这对您现在没有帮助。如果您为Oracle支持提出服务请求,我将确保您得到了解决此问题的方法(假设您使用的是受支持的APEX版本)。
https://stackoverflow.com/questions/61369434
复制相似问题