Как я могу создать ссылку на базу данных только для чтения в оракуле - PullRequest
4 голосов
/ 08 октября 2010

Рассмотрим следующий сценарий ....

У меня есть мастер-пользователь MASTER.

У меня есть тестовый пользователь TEST.

Для обоих пользователей структура таблицы одинакова. Оба пользователя могут находиться на разных серверах Oracle.

затем я создаю ссылку на базу данных как master_link, войдя в качестве тестового пользователя в sql plus, используя следующую команду

СОЗДАТЬ ССЫЛКУ БАЗЫ ДАННЫХ master_link ПОДКЛЮЧИТЬСЯ К МАСТЕРУ, ОПРЕДЕЛЯЕМОМУ ИСПОЛЬЗОВАНИЕМ ПАРОЛЯ (ОПИСАНИЕ = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.9.139 (PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))

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

обновление таблицы1 @ master_link set display_title = 'PONDS';

Этот запрос обновляет таблицу table1 главного пользователя.

Мое требование - я хочу дать разрешение только на чтение для ссылки на базу данных (master_link), чтобы тестовый пользователь не мог изменять или вставлять в любую таблицу в главном пользователе с помощью ссылки на базу данных.

Ответы [ 2 ]

7 голосов
/ 08 октября 2010

В любой базе данных, в которой находится схема MASTER, вам нужно будет создать нового пользователя (то есть MASTER_READ_ONLY). Предоставьте пользователю MASTER_READ_ONLY доступ SELECT ко всем таблицам MASTER (скорее всего, через роль). При необходимости создайте либо общедоступные синонимы, либо частные синонимы в схеме MASTER_READ_ONLY, которые ссылаются на объекты в MASTER. Затем при создании ссылки на базу данных используйте учетную запись MASTER_READ_ONLY, а не учетную запись MASTER.

Что-то вроде

Как администратор базы данных

CREATE USER master_read_only
  IDENTIFIED BY password2;

GRANT create session, create synonym
   TO master_read_only;

CREATE ROLE master_ro_role;

GRANT master_ro_role
   TO master_read_only;

Как МАСТЕР

BEGIN
  FOR x IN (SELECT * FROM user_tables)
  LOOP
    EXECUTE IMMEDIATE 
      'GRANT SELECT ON master.' || x.table_name || 
        ' TO master_ro_role';
  END LOOP;
END;

Как MASTER_READ_ONLY

BEGIN
  FOR x IN (SELECT * FROM all_tables WHERE owner='MASTER')
  LOOP
    EXECUTE IMMEDIATE 
      'CREATE SYNONYM ' || x.table_name || 
        ' FOR master.' || x.table_name;
  END LOOP;
END;

В базе данных, в которой был создан пользователь TEST

CREATE DATABASE LINK master_link 
  CONNECT TO master_read_only 
  IDENTIFIED BY password2 
  USING (DESCRIPTION = 
          (ADDRESS_LIST = 
            (ADDRESS = 
              (PROTOCOL = TCP) 
              (HOST =192.168.9.139)
              (PORT = 1521))) 
            (CONNECT_DATA = (SERVICE_NAME = orcl)))
2 голосов
/ 08 октября 2010

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

(я предполагаю, что update any table не предоставлено public на главном экземпляре ...) <ч /> В качестве альтернативы, если вы не можете создать нового пользователя на главном экземпляре, вы можете вместо этого создать нового пользователя на тестовом экземпляре. Если вы создадите ссылку на базу данных в схеме этого нового пользователя, вы можете создать представления только для чтения, используя ссылку, к которой ваш test пользователь может получить доступ, не раскрывая ссылку на базу данных. Это может быть более сложным для тех, кто придет позже, чтобы отследить, что происходит, но это вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...