Ben*_*ons 1 database testing oracle schema
我知道这可以做到,因为我在上一个工作场所见过它,但我不知道如何复制!
基本上,有一个MASTER用户对我们所有的表都有写权限.在我们的应用程序的DB适配器连接设置中,我们使用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.我有一种预感,你在连接设置中实际上无法做到这一点......所以从第一个开始,我需要做些什么才能设置这样的测试表?像共享架构的东西?
如果您的代码使用完全限定的表名(即MASTER.real_data_table或SIMMBOT.real_data_table),则从配置的角度来看,无法更改所引用的对象.
但是,假设您的代码没有使用完全限定的表名 - 如果它只是从中选择real_data_table,那么Oracle将首先在当前模式中查找具有该名称的对象,然后查找具有该名称的公共同义词.
如果连接为MASTER,则可以更改当前架构
ALTER SESSION SET current_schema = SIMMBOT
Run Code Online (Sandbox Code Playgroud)
完成后,对表名的所有非限定引用都将解析为SIMMBOT模式中的表.请注意,MASTER需要为用户分别授予对SIMMBOT架构中对象的适当访问权限 - 设置当前架构只会影响名称解析,而不会影响权限.该SIMMBOT模式还需要有充分的代码要reference--没有办法指定用于解析不合格名称的层次结构表.您无法告诉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;
Run Code Online (Sandbox Code Playgroud)
或者你可以创建适用于所有用户的公共同义词(除拥有这些对象的用户之外)
CREATE PUBLIC SYNONYM real_data_table FOR simmbot.real_data_table;
CREATE PUBLIC SYNONYM some_other_table FOR master.some_other_table;
Run Code Online (Sandbox Code Playgroud)