我知道这可以做到,因为我在上一个工作场所见过它,但我不知道如何复制!
基本上,有一个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
。我有一种预感,你在连接设置中实际上无法做到这一点......所以从第一个开始,我需要做些什么才能设置这样的测试表?像共享架构的东西?
答案 0 :(得分:5)
如果您的代码使用完全限定的表名(即MASTER.real_data_table
或SIMMBOT.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;