Возможно ли создать пользователя базы данных только для чтения в базе данных Oracle? Как?
Oracle - Как создать пользователя, использующего только для чтения
Ответ 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.