Назад | Перейти на главную страницу

Предоставление доступа только для чтения к существующей схеме Oracle

у нас есть схема Oracle 11g, которую наше приложение использует для выбора, вставки и обновления, но у нас есть запрос от одного из наших клиентов на предоставление доступа только для чтения к тем же базовым таблицам и представлениям, которыми владеет приложение.

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

Любая помощь или указатели на подход или функцию Oracle, на которые я должен обратить внимание, будут очень признательны, спасибо!

Вам понадобится отдельная учетная запись, чтобы предоставить доступ только для чтения. Я бы предложил добавить роль, для которой вы также предоставляете доступ только для чтения - затем вы можете повторно использовать эту роль, если в будущем этот доступ понадобится большему количеству пользователей.

CREATE ROLE my_read_only_role;

BEGIN
  FOR x IN (SELECT table_name FROM dba_tables WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO my_read_only_role';
  END LOOP;
  FOR y IN (SELECT view_name FROM dba_views WHERE owner=<<schema name>>)
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON ' || y.view_name || ' TO my_read_only_role';
  END LOOP;
END;
/

GRANT my_read_only_role TO new_customer_account;

Как только это будет сделано, для выбора данных в новой учетной записи нужно будет поставить перед именами таблиц имя схемы. В качестве альтернативы вы можете создать общедоступные синонимы для каждого объекта (вы можете добавить еще один EXECUTE IMMEDIATE в каждый цикл в приведенном выше коде). Или вы можете попросить пользователя запустить команду

ALTER SESSION SET current_schema = <<schema name>>

при входе в систему. Вы также можете создать триггер входа в новую учетную запись, который будет делать это автоматически. Это вызовет <<schema name>> неявно добавляется как префикс схемы. Это не влияет на привилегии сеанса - у пользователя все еще есть привилегии только для чтения, имя схемы по умолчанию только что было изменено.

Я создал new_customer_account без квот как sysdba:

create user new_customer_account
  IDENTIFIED BY new_password
  DEFAULT TABLESPACE USERS
  TEMPORARY TABLESPACE TMP
  PROFILE DEFAULT
  ACCOUNT UNLOCK;
GRANT CONNECT TO new_customer_account;
GRANT CREATE SESSION TO new_customer_account;
ALTER USER new_customer_account QUOTA 0 ON users;

Application_user предоставил право выбора для соответствующих представлений (и / или таблиц):

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = ''
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'GRANT SELECT ON application_user.'
          || i.view_name || ' TO new_customer_account';
 END LOOP;
END;

После этого new_customer_account создает новые синонимы:

BEGIN
 FOR i IN (SELECT *
             FROM all_views
            WHERE owner = 'application_user'
              AND relevant_where_clause) LOOP
  EXECUTE IMMEDIATE 'CREATE SYNONYM ' || i.view_name
          || ' FOR application_user.' || i.view_name;
 END LOOP;
END;

Я почти уверен, что вам нужно создать новую учетную запись и предоставить выбор только этому пользователю.