Подтвердить что ты не робот

Oracle - Как создать пользователя, использующего только для чтения

Возможно ли создать пользователя базы данных только для чтения в базе данных Oracle? Как?

4b9b3361

Ответ 1

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

При создании пользователя

CREATE USER ro_user
 IDENTIFIED BY ro_user
 DEFAULT TABLESPACE users
 TEMPORARY TABLESPACE temp;

у пользователя даже нет разрешения на вход в базу данных. Вы можете предоставить

GRANT CREATE SESSION to ro_user

а затем вы можете предоставить все привилегии чтения, которые вы хотите. Например, если вы хотите, чтобы RO_USER мог запросить SCHEMA_NAME.TABLE_NAME, вы сделали бы что-то вроде

GRANT SELECT ON schema_name.table_name TO ro_user

Как правило, вам лучше создать роль и предоставить привилегии объектам роли, чтобы потом предоставить роль другим пользователям. Что-то вроде

Создайте роль

CREATE ROLE ro_role;

Предоставить доступ к роли SELECT для каждой таблицы в конкретной схеме

BEGIN
  FOR x IN (SELECT * FROM dba_tables WHERE owner='SCHEMA_NAME')
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON schema_name.' || x.table_name || 
                                  ' TO ro_role';
  END LOOP;
END;

И затем предоставите роль пользователю

GRANT ro_role TO ro_user;

Ответ 2

create user ro_role identified by ro_role;
grant create session, select any table, select any dictionary to ro_role;

Ответ 3

Выполните следующую процедуру, например, как пользовательскую систему.

Установите p_owner владельцу схемы и p_readonly на имя пользователя, использующего только для чтения.

create or replace
procedure createReadOnlyUser(p_owner in varchar2, p_readonly in varchar2) 
AUTHID CURRENT_USER is
BEGIN
    execute immediate 'create user '||p_readonly||' identified by '||p_readonly;
    execute immediate 'grant create session to '||p_readonly;
    execute immediate 'grant select any dictionary to '||p_readonly;
    execute immediate 'grant create synonym to '||p_readonly;

   FOR R IN (SELECT owner, object_name from all_objects where object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP
      execute immediate 'grant select on '||p_owner||'.'||R.object_name||' to '||p_readonly;
   END LOOP;
   FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP
      execute immediate 'grant execute on '||p_owner||'.'||R.object_name||' to '||p_readonly;
   END LOOP;
   FOR R IN (SELECT owner, object_name FROM all_objects WHERE object_type in('TABLE', 'VIEW') and owner=p_owner) LOOP
      EXECUTE IMMEDIATE 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"';
   END LOOP;
   FOR R IN (SELECT owner, object_name from all_objects where object_type in('FUNCTION', 'PROCEDURE') and owner=p_owner) LOOP
      execute immediate 'create synonym '||p_readonly||'.'||R.object_name||' for '||R.owner||'."'||R.object_name||'"';
   END LOOP;
END;

Ответ 4

вы можете создать пользователя и предоставить привилегии

создать пользователя read_only, идентифицированного read_only; создать сеанс создания, выбрать любую таблицу для read_only;

Ответ 5

Невозможно установить значение по умолчанию db из-за множества публичных исполнений, которые каждый пользователь получает автоматически через public.