При установлении доступа к данным в удаленной базе данных предпочтительны ли представления или синонимы? - PullRequest
5 голосов
/ 11 апреля 2019

Рассмотрим сценарий, в котором у вас есть две базы данных: В базе данных 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, это изменит рекомендацию?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2019

Используйте синоним для простоты.

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

Возможно, представление усложняет оптимизатор Oracle.

Есть несколько веских причин дляс представлением:

  • Вы хотите ограничить видимые столбцы
  • Если новые столбцы добавляются в удаленную таблицу, вы не хотите, чтобы они отображались локально
  • Вы хотите ограничить видимые строки, присоединиться к другим таблицам и т. Д.
  • Вы хотите, чтобы представление было недействительным, если изменения выполняются на удаленном сайте (например, удаление столбца), а необнаружение во время выполнения приложения

Время создания представления - это когда эти условия существуют.Даже тогда я бы выбрал вид из синонима.

5 голосов
/ 18 апреля 2019

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

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

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 

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

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

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 

Так что вам нужно заново создать представление, чтобы увидеть изменения. С другой стороны, это может быть преимуществом, если вы не хотите, чтобы удаленные изменения 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
5 голосов
/ 18 апреля 2019

Лично я бы предпочел синоним. Вот для чего нужны синонимы, что дает вам более короткий синтаксис для доступа к объекту. Представление больше для сохранения конкретного запроса для последующего повторного использования. Теперь, если вы хотите ограничить доступные столбцы в исходной таблице или что-то в этом роде, тогда вы должны использовать представление.

2 голосов
/ 22 апреля 2019

Синонимы - это просто указатели на объекты. Если требование состоит в том, чтобы просто получить доступ к объекту без необходимости каждый раз указывать ссылку / владельца базы данных, это лучший подход (учитывая, что вы не хотите ограничивать доступ к столбцам).

Представления в основном являются окном для данных базового объекта. Вы можете быть избирательными в доступе к столбцу (это невозможно в синониме), и поскольку представление основано на запросе SQL, вы можете выполнять любые виды онлайн-манипулирования данными, например, изменение формата даты, используя функции sql (верхний, нижний, nvl и т. Д.). .) опять же, что невозможно с синонимами. У вас также есть возможность изменить оператор SQL, чтобы включить более сложный оператор SQL, если в будущем возникнет потребность.

Представления хороши, если вы просто хотите выполнять выборку и отображение, если вы хотите использовать это в другом запросе, рекомендуется использовать синонимы, так как нет промежуточного слоя SQL, поэтому доступ к данным быстрее.

Все сводится к вашему требованию и способу использования объекта.

...