Авг 062013
 

Роль по умолчанию для пользователя - это роль, которая применяется сразу в момент соединения. Т.е. возможна ситуация, когда пользователю дана некая роль, но она не указана как DEFAULT ROLE. В таком случае он часто не может самостоятельно ею воспользоваться, звонит и задаёт неудобные вопросы.
Рассмотрим ситуацию чуть более подробно, проведём небольшой эксперимент:

-- создадим пользователя-владельца таблицы
CREATE USER cube IDENTIFIED BY "cube";
GRANT CREATE SESSION TO cube;
GRANT UNLIMITED TABLESPACE TO cube;
-- и саму таблицу
CREATE TABLE cube.tbl AS SELECT * FROM dba_tab_privs;
 
-- теперь создадим роль
CREATE ROLE cube2_role;  
-- и дадим ей право читать из cube.tbl
GRANT SELECT ON cube.tbl TO cube2_role;
 
-- создадим второго пользователя
CREATE USER cube2 IDENTIFIED BY "cube";
GRANT CREATE SESSION TO cube2;
 
-- дадим ему нашу роль
GRANT cube2_role TO cube2;

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

-- убираем роли по умолчанию
ALTER USER cube2 DEFAULT ROLE none;
 
CONN cube2/cube
-- Пробуем прочитать табличку:
SELECT COUNT(*) FROM cube.tbl;

Закономерно получаем ошибку ORA-00942: table or view does not exist. Вот так, роль есть, а таблицу не видим! Ролью надо уметь пользоваться:

CONN cube2/cube
SET ROLE ALL;
-- Или так, если не все роли нужны:
SET ROLE cube2_role;
SELECT COUNT(*) FROM cube.tbl;

Теперь всё работает.
Итак, чтобы пользоваться ролью, она должна быть прописана как одна из DEFAULT ролей для пользователя, либо он сам должен явно выбирать нужную роль.
Понять, установлена ли роль пользователю по умолчанию, можно из представления dba_role_privs, поле default_role.

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">

(обязательно)

(обязательно)