Jer*_*nch 5 oracle dblink oracle11g
考虑具有两个数据库的情况:在数据库A上,您需要访问数据库B上的数据。
您可以在数据库A上创建一个视图,该视图从数据库B的表中选择。
CREATE OR REPLACE VIEW Demographics.Employees(
employee_id, employee_dept
)
AS
SELECT employee_id, employee_dept
FROM Employee@DB_B;
/
Run Code Online (Sandbox Code Playgroud)
或者,您可以在数据库A上创建一个同义词,该同义词指向数据库B上的表。
CREATE OR REPLACE SYNONYM Demographics.Employees FOR Employee@DB_B;
Run Code Online (Sandbox Code Playgroud)
使用跨数据库链接的视图和跨数据库链接的同义词有什么优缺点?
如果数据库位于Exadata平台内,这会改变建议吗?
就个人而言,我更喜欢这个同义词。这就是同义词的含义,从而为您提供了访问对象的较短语法。视图更多地用于保存特定查询以供以后重用。现在,如果您想限制源表或其他内容的可用列,那就是使用视图的时候。
为简单起见,请使用同义词。
如果本地数据库应该查看远程数据库中的所有行和列,则已定义的视图就不必要了。它增加了复杂性,因为视图中可能存在一些其他逻辑。寻求了解系统的人将需要花费时间来检查和理解视图定义。
对于Oracle优化器来说,这种观点可能使事情变得更加复杂。
有观点有一些正当理由:
这些条件存在时就是创建视图的时间。即使那样,我还是要从同义词中选择视图。
通过数据库链接创建视图时,就是在本地数据库上创建对象。这意味着您在本地具有有关远程对象的字典信息。
而同义词只是指向远程对象的指针。因此,您所拥有的只是同义词定义。
create database link loopback
using 'localhost/pdb1';
create table t (
c1 int
);
create or replace synonym s
for t@loopback;
create or replace view v as
select * from t@loopback;
select table_name, column_name, data_type
from user_tab_cols
where table_name in ( 'S', 'V' )
order by table_name, column_name ;
TABLE_NAME COLUMN_NAME DATA_TYPE
V C1 NUMBER
Run Code Online (Sandbox Code Playgroud)
因此,如果您拥有检查表结构(列,数据类型等)的工具,则使用视图将很方便。
另一方面,由于视图是本地对象,因此不会自动传播对远程表的更改:
alter table t
add ( c2 date );
info s
TABLE: T
LAST ANALYZED:
ROWS :
SAMPLE SIZE :
INMEMORY :DISABLED
COMMENTS :
Columns
NAME DATA TYPE NULL DEFAULT COMMENTS
C1 NUMBER(38,0) Yes
C2 DATE Yes
info v
Columns
NAME DATA TYPE NULL DEFAULT COMMENTS
C1 NUMBER(38,0) Yes
Run Code Online (Sandbox Code Playgroud)
因此,您需要重新创建视图以查看更改。另一方面,如果您不希望远程DDL更改立即显示在本地数据库中,则这可能是一个优势。
请注意,本地视图和远程表之间没有依赖关系。因此,中断更改(例如删除列)不会使视图无效。您只有在查询时才能找到:
alter table t
drop ( c1 );
select status from user_objects
where object_name = 'V';
STATUS
VALID
select * from v;
ORA-00904: "C1": invalid identifier
select * from s;
no rows selected
Run Code Online (Sandbox Code Playgroud)