Database 意外地看到其他架构上的对象

Database 意外地看到其他架构上的对象,database,oracle,oracle11g,Database,Oracle,Oracle11g,我在一家使用Weblogic应用程序和Oracle 11g数据库的公司工作 我们有许多测试机器来测试应用程序。每台计算机都连接到相同的数据库实例,但使用不同的模式 例如,1号机器使用schematest1,并有自己的一组表,如test1.payment、test1.customer等。2号机器使用schematest2并有表test2.payment、test2.customer等 通常,如果我们在schematest1上访问数据库,并应用以下查询 从对象名为“付款”的所有对象中选择* 我们将得

我在一家使用Weblogic应用程序和Oracle 11g数据库的公司工作

我们有许多测试机器来测试应用程序。每台计算机都连接到相同的数据库实例,但使用不同的模式

例如,1号机器使用schema
test1
,并有自己的一组表,如
test1.payment
test1.customer
等。2号机器使用schema
test2
并有表
test2.payment
test2.customer

通常,如果我们在schema
test1
上访问数据库,并应用以下查询

从对象名为“付款”的所有对象中选择*

我们将得到一行,其中object_name='PAYMENT'和owner='TEST1'

有一天,2号测试机上的应用程序启动失败,出现错误消息
数据库中有多个FOO类型的所有者,其中
FOO
是一个假名

我用这个SQL检查了数据库中的类型
FOO

从对象名为'FOO'的所有对象中选择*

并从每个模式中获取所有者所在的行,并认为这是根本原因

我不允许编辑导致问题的应用程序源代码部分。所以我想在数据库站点中修复它。但是DBA将缺席一段时间,我没有DBA特权,但我可以访问所有模式
test1
test2

问题是:


为什么
select*from all_objects,其中object_name='FOO'
返回其他架构中的行,以及如何使其仅返回当前架构中的一行?

所有_objects显示您登录时可以“看到”的数据库中的所有对象。用户_objects只显示您架构中的对象。DBA_对象显示数据库中的所有对象,无论您是否可以访问它们。这就是为什么查询DBA视图通常比查询所有视图更快,b/c在填充结果集之前没有安全检查

全部_

所有用户

用户有权限访问的对象

包括用户拥有的对象。这些视图遵循当前的 启用的角色

您可以取消对另一个对象或模式的授权,这允许数据库在查询中解决冲突对象,但这可能也需要DBA干预

您还可以更改应用程序代码,以便在查询中显式地包含模式(TEST1或TEST2),以便找不到其他对象