这是一个棘手的案例,其中包括DBA在内的5个人已经挣扎了好几天......我终生考虑了能够确定问题根本原因的人。
这里是:
Oracle客户端:10g Oracle Server:11g
我们有2个架构和1个用户:
SCHEMA1
SCHEMA2
USER
我们在'TOTO'
(SCHEMA1
)中定义了一个表SCHEMA1.TOTO
我们在'TOTO'
中定义了一个名为'TOTO'
的表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
错误。
我坚持认为,在它工作的时间和失败的时间之间没有任何变化,我们刚刚重新启动了应用程序(当然在每次启动时都以相同的方式重新连接到数据库)。 我们已经通过DBA监控USER,SCHEMA1,SCHEMA2上的所有事件进行了调查,希望找到一个外部流程,在成功和失败之间修改GRANTS,但没有任何变化。然而,在某些时候,随机地我们得到ORA-00942错误,然后我们重新启动应用程序几次,它又回来了......
有人会有想法或任何建议/提示可能会让我们找出我们在这里缺少的东西吗?
非常感谢你的帮助!
答案 0 :(得分:3)
拨款应转到USER
,而不是SCHEMA2:
GRANT SELECT, UPDATE, DELETE, INSERT ON schema1.toto TO userxy;
这应该可以解决问题。如果没有,请您发布
的结果SELECT * FROM all_objects WHERE object_name='TOTO';