在Oracle Cloud上,CURRENT_SCHEMA会在没有明显原因的情况下持续变化

人工智能 2026-07-12

我在参加一门课程,这门课程为不同的作业使用不同的数据库,没什么复杂,这是该系列课程的第一门课。在向AI咨询后,我决定再创建一个模式(schema),这又创建了一个用户,现在我有ADMIN和 ENTRYORDERSCHEMA。

在做练习的时候我写下:

-- Change Schema:
ALTER SESSION SET CURRENT_SCHEMA = ENTRYORDERSCHEMA;

--Check change:
SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS ACTIVE_SCHEMA 
FROM DUAL;

这段内容能正确地告诉我当前处于哪个模式,并在ADMIN和 ENTRYORDERSCHEMA之间切换。

问题在于如果我不输入“命令”,它会自己切换到ENTRYORDERSCHEMA

所以一个在ADMIN模式下30秒前还在工作的查询

SELECT * FROM EVENTREQUEST
WHERE DateReq >= TO_DATE('1/1/2026', 'MM/DD/YYYY') + INTERVAL '30' DAY;

会返回这个错误:

ORA-00942: table or view "ENTRYORDERSCHEMA"."EVENTREQUEST" does not exist

而当我检查时,它会改变 'CURRENT_SCHEMA'

这种行为在网页工具和VS Code扩展中都在发生。

你可以从图片看到,它原本是如何工作,突然后来就改了模式。

enter image description here

解决方案

CURRENT_SCHEMA 是会话状态。 一旦你运行:

ALTER SESSION SET CURRENT_SCHEMA = ENTRYORDERSCHEMA;

该设置对该数据库会话一直生效,直到你再次更改它、断开连接,或工具给你一个不同的会话。它并非限于单个查询或单个工作表。

所以这个错误:

ORA-00942: table or view "ENTRYORDERSCHEMA"."EVENTREQUEST" does not exist

意味着Oracle将你未限定的表名解析为:

ENTRYORDERSCHEMA.EVENTREQUEST

而不是:

ADMIN.EVENTREQUEST

Oracle并不是随机改变模式。更可能发生的是以下情况之一:

  • 在你之前运行 ALTER SESSION 之后,同一连接/会话被重复使用
  • 工作表/脚本中仍然包含 ALTER SESSION 命令,并再次执行
  • 工具/扩展有一个启动脚本或连接设置,会改变 CURRENT_SCHEMA

为避免歧义,要么显式切换回去:

ALTER SESSION SET CURRENT_SCHEMA = ADMIN;

SELECT *
FROM EVENTREQUEST
WHERE DateReq >= DATE '2026-01-01' + INTERVAL '30' DAY;

或对表名进行限定:

SELECT *
FROM ADMIN.EVENTREQUEST
WHERE DateReq >= DATE '2026-01-01' + INTERVAL '30' DAY;

对于课程练习,除非课程明确要求,否则我会避免依赖 CURRENT_SCHEMA。在学习期间,请以模式所有者的身份连接,或完全限定表名。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章