Oracle同义词随机不可见

时间:2012-11-29 17:04:16

标签: oracle random synonym

这是一个棘手的案例,其中包括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错误,然后我们重新启动应用程序几次,它又回来了......

有人会有想法或任何建议/提示可能会让我们找出我们在这里缺少的东西吗?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

拨款应转到USER,而不是SCHEMA2:

GRANT SELECT, UPDATE, DELETE, INSERT ON schema1.toto TO userxy;

这应该可以解决问题。如果没有,请您发布

的结果
SELECT * FROM all_objects WHERE object_name='TOTO';