这是一个棘手的案例,其中包括 DBA 在内的 5 个人一直在苦苦挣扎数天……我会终身考虑将确定问题根本原因的人。
这里是:
Oracle 客户端:10g Oracle 服务器:11g
我们有 2 个模式和 1 个用户:
SCHEMA1
SCHEMA2
USER
我们有 1 个'TOTO'
在SCHEMA1
( SCHEMA1.TOTO
) 中定义的表 我们有一个私有同义词 table 'TOTO'
,称为'TOTO'
defined in SCHEMA2
,创建如下:
CREATE SYNONYM SCHEMA2.TOTO FOR SCHEMA1.TABLE1;
我们已将“SCHEMA2.TOTO”(同义词等)上的 SELECT、UPDATE、DELETE、INSERT 权限授予 SCHEMA2(以便从 SCHEMA2 运行的任何会话都可以访问同义词表)
GRANT SELECT, UPDATE, DELETE, INSERT ON SCHEMA2.TOTO TO SCHEMA2;
我们的应用程序使用 连接到数据库USER
,然后直接切换到SCHEMA2
:
ALTER SESSION SET CURRENT_SCHEMA=SCHEMA2;
然后,它尝试在同义词表上执行选择查询,而不用 SCHEMA1 作为同义词名称的前缀(这是我们使用的框架的约束):
SELECT COL FROM TOTO;
大多数情况下,此查询都能成功运行,这是我们所期望的,因为我们已将会话更改为SCHEMA2
,默认情况下是查看对象的位置。
但有时它会失败,并出现ORA-00942: table or view does not exist
错误。
我坚持这样一个事实,即在它工作和失败之间,什么都没有改变,我们只是重新启动了应用程序(这当然是在每次启动时以相同的方式重新连接到数据库)。我们已经与监控 USER、SCHEMA1、SCHEMA2 上的所有事件的 DBA 进行了调查,希望找到一个外部进程在其中一个上修改 GRANTS,在成功和失败之间,但没有任何变化。然而,在某些时候,我们随机得到 ORA-00942 错误,然后我们重新启动应用程序几次,它又回来了......
有人有什么想法或任何建议/提示可以引导我们找出我们在这里缺少的东西吗?
非常感谢您的帮助!