可以通过在A库设置指向B库的database link来直接访问B库的数据
语法
create [public] database link b_lk connect to userA identified by xxx using 'tnsname'
其中
,如果省略public则创建的是private的连接
,只能当前所有者可以使用这个link
使用connect to user identified by xxx则所有通过dblink的用户在访问B库时都使用userA这个用户
b_lk指的是database link的名字,如果A库的global_names=true,则这个名字一定要使用B库的global_name.在b库执行select * from global_name可以得到
。否则建立db link的时候不会报错,但是在执行查询时会报错
ORA-02085: database link b_lk connects to b.world.COM
tnsname指的是A库的tnsnames文件中配置的b库名称
也可以直接使用以下的语句代替
USING '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = b.world.COM)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = b)
)
)';
a库使用dblink访问b库时比如select * from table@b_lk默认会在a库生成一个事务,可以查询v$transaction得到
。有三种方法来控制这个事务
1.查询后执行rollback或者commit
2.查询后关闭link :alter session close database link b_lk
SQL> alter session close database link b_lk;
ERROR:
ORA-02080: database link is in use
SQL> rollback;
Rollback complete.
SQL> alter session close database link b_lk;
Session altered.
注意:在rollback因为dblink查询产生的事务前,无法关闭dblink。关闭后可以再次执行基于dblink的查询
3.set transaction read only;让事务只读,dblink将不产生事务,但是也限制了同一个session下对本地库的写操作
注意:有了dblink后,可以执行对b库的insert等dml操作,有
安全隐患,如何控制只能对b库进行读操作呢?