Oracle 11g:如何使用测试用户的测试表覆盖默认模式表

时间:2011-08-22 19:26:59

标签: database oracle testing schema

我知道这可以做到,因为我在上一个工作场所见过它,但我不知道如何复制!

基本上,有一个MASTER用户对我们所有的表都有写权限。在我们的应用程序的数据库适配器连接设置中,我们使用DEFAULT_SCHEMA: MASTER

我为自己创建了一个新的测试用户(与主用户在同一个数据库上,而不是使用数据库链接),这样我就可以自由地创建测试数据而不会弄乱实际数据。然后为我的测试用户复制了一个表,以便我可以自由地操作数据:create table SIMMBOT.real_data_table as select * from MASTER.real_data_table

问题是我不知道如何设置连接,以便Oracle知道用我自己的MASTER.real_data_table覆盖SIMMBOT.real_data_table。我有一种预感,你在连接设置中实际上无法做到这一点......所以从第一个开始,我需要做些什么才能设置这样的测试表?像共享架构的东西?

1 个答案:

答案 0 :(得分:5)

如果您的代码使用完全限定的表名(即MASTER.real_data_tableSIMMBOT.real_data_table),那么从配置的角度来看,无法改变所引用的对象。

但是,假设您的代码没有使用完全限定的表名 - 如果它只是从real_data_table中选择,那么Oracle将首先在当前模式中查找具有该名称的对象,然后查找具有该名称的公共同义词。

如果您以MASTER身份连接,则可以更改当前架构

ALTER SESSION SET current_schema = SIMMBOT

完成此操作后,对表名的所有非限定引用都将解析为SIMMBOT模式中的表。请注意,MASTER用户需要分别对SIMMBOT架构中的对象授予适当的访问权限 - 设置当前架构只会影响名称解析,而不会影响权限。 SIMMBOT模式还需要包含代码想要引用的每个表 - 没有办法指定用于解析非限定名称的层次结构。您无法告诉Oracle首先在SIMMBOT架构中解析非限定名称,然后再解析MASTER架构。

另一种方法是为每个表创建同义词,并操纵同义词以引用某些或所有用户的表。如果您的应用程序以没有任何对象的第三个用户身份登录 - 例如APP_USER - 您可以在APP_USER模式中创建指向不同模式中不同对象的私有同义词 -

CREATE SYNONYM app_user.real_data_table FOR simmbot.real_data_table;
CREATE SYNONYM app_user.some_other_table FOR master.some_other_table;

或者您可以创建适用于所有用户的公共同义词(除了拥有这些对象的用户)

CREATE PUBLIC SYNONYM real_data_table FOR simmbot.real_data_table;
CREATE PUBLIC SYNONYM some_other_table FOR master.some_other_table;