Что предпочтительнее использовать для доступа к данным в удаленной БД, представления или синонимы?

Например, есть две БД. В БД A нужно получить доступ к данным в удаленной БД B.

Можете создать представление в A, которое будет выбирать из таблицы в B:

CREATE OR REPLACE VIEW Demographics.Employees (employee_id, employee_dept) AS
    SELECT employee_id, employee_dept
    FROM Employee@DB_B;

Или можено создать синоним в A, который будет указывать на таблицу в B.

CREATE OR REPLACE SYNONYM Demographics.Employees FOR Employee@DB_B;

Каковы преимущества и недостатки использования представления по сравнении с синонимом?

Если БД находятся на платформе Exadata, изменит ли это рекомендацию?


Свободный перевод вопроса When establishing access to data on a remote database, are views or synonyms preferred? от участника @Jeromy French


Ответы (1 шт):

Автор решения: 0xdb

Когда вы создаете представление по ссылке базы данных, вы создаете объект в локальной базе данных. Это означает, что у вас есть словарная информация об удаленном объекте, локально.

В то время как синоним - это просто указатель на удаленный объект. Поэтому все, что есть в локальной БД - только определение синонима.

create database link loopback using 'localhost/pdb1';

create table t (val 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            VAL           NUMBER 

Поэтому представления может быть полезно, если есть инструменты, которые проверяют структуру локальных таблиц (имена столбцов, типы данных и т.д.).

С другой стороны, поскольку представление является локальным объектом, изменения в удаленной таблице не переносятся автоматически:

alter table t add (modified date); 

info s

TABLE: T 
     LAST ANALYZED: 
     ROWS         : 
     SAMPLE SIZE  : 
     INMEMORY     :DISABLED 
     COMMENTS     : 

Columns 
NAME         DATA TYPE      NULL  DEFAULT    COMMENTS
 VAL         NUMBER(38,0)   Yes              
 MODIFIED    DATE           Yes              

info v

Columns 
NAME         DATA TYPE      NULL  DEFAULT    COMMENTS
 VAL         NUMBER(38,0)   Yes              

Таким образом, нужно заново создать представление, чтобы увидеть изменения. Хотя, это может быть и преимуществом, если есть требование, чтобы удаленные изменения DDL не сразу были видны в локальной БД.

Следует обратить внимание, что между локальным представлением и удаленной таблицей нет зависимости. Поэтому "разрушающие" изменения (например, удаление столбца) не сделают представление недействительным. Об этом станет известно только при запросе:

alter table t drop (val);

select status from user_objects
where  object_name = 'V';

STATUS
-------
VALID

select * from v
/
ORA-00904: "VAL": invalid identifier

select * from s;

no rows selected

Свободный перевод ответа от участника @Chris Saxon

→ Ссылка