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