Май 132011
 

Оператор Grant позволяет нам предоставить привилегию или назначить роль пользователю. Информация о предоставленных правах хранится в трёх представлениях: dba_tab_privs, dba_sys_privs, и dba_role_privs.
У данного оператора есть особенность: При выдаче прав на объекты в dba_tab_privs в поле grantor будет указано не имя пользователя, который, собственно предоставил грант (будь то sys, system, или юзер с ролью DBA), а владелец объекта, т.е. было бы корректнее назвать этот столбец не grantee, а owner.
Как обычно, на слово мне не верим, и проводим эксперимент:

-- Подключимся к базе и создадим табличку:
CONN cube/cube
CREATE TABLE test_grant AS SELECT * FROM v$session;
 
-- А теперь подключимся как SYS
-- (ну или как system или с ролью DBA - не важно)
CONN / AS sysdba
 
-- Дадим грант кому-нибудь ещё
GRANT SELECT ON cube.test_grant TO cube2;
 
-- Посмотрим на дело рук своих
-- и увидим, что грантор - cube, а не sys:
SELECT grantor, table_name, grantee FROM dba_tab_privs WHERE table_name = 'TEST_GRANT';

Таким образом, dba_tab_privs не позволит точно определить, кто же именно дал грант на объект, но выход есть - аудит.
Это не баг, а ожидаемое поведение начиная с 9 версии.

 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="">

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

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