у нас есть схема 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;
Я почти уверен, что вам нужно создать новую учетную запись и предоставить выбор только этому пользователю.