Что предпочтительнее использовать для доступа к данным в удаленной БД, представления или синонимы?
Например, есть две БД. В БД 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 шт):
Когда вы создаете представление по ссылке базы данных, вы создаете объект в локальной базе данных. Это означает, что у вас есть словарная информация об удаленном объекте, локально.
В то время как синоним - это просто указатель на удаленный объект. Поэтому все, что есть в локальной БД - только определение синонима.
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