Управление доступом к базе данных Oracle:

Полномочия – это право на выполнение конкретного типа SQL-оператора или на доступ к объекту базы данных, принадлежащему другому пользователю. В базе данных Oracle необходимо явно предоставить пользователю полномочия для выполнения любых действий, включая подключение к базе данных или выборку, изменение и обновление данных в любой таблице, кроме собственной.

Существуют два основных типа полномочий Oracle: системные полномочия и объектные полномочия. Для предоставления пользователям как системных, так и объектных полномочий служит оператор GRANT.


Системные полномочия:

Системные полномочия позволяют пользователю выполнить конкретное действие в базе данных либо действие с любым объектом схемы, конкретного типа. Хороший пример первого типа системных полномочий – полномочия, которые позволяют подключаться к базе данных, носящие название полномочий CONNECT. Другими полномочиями этого типа являются полномочия CREATE TABLESPACE, CREATE USER, DROP USER и ALTER USER.

Второй класс системных полномочий предоставляет пользователям право на выполнение операций, которые влияют на объекты в любой схеме. Примерами этого типа системных полномочий служат ANALYZE ANY TABLE, GRANT ANY PRIVILEGE, INSERT ANY TABLE, DELETE ANY TABLE и т.п. Системные полномочия являются очень мощным средством и выдача их не тому пользователю может оказать разруши тельное влияние на базу данных.

Ниже перечислены некоторые наиболее часто используемые полномочия базы данных Oracle:

  • ADVISOR
  • ALTER DATABASE
  • ALTER SYSTEM
  • AUDIT SYSTEM
  • CREATE DATABASE LINK
  • CREATE TABLE
  • CREATE ANY INDEX
  • CREATE SESSION
  • CREATE TABLESPACE
  • CREATE USER
  • DROP USER
  • INSERT ANY TABLE

Пример:

GRANT CREATE SESSION TO scott;


Объектные полномочия:

Объектные полномочия – это полномочия по отношению к различным типам объектов базы данных. Объектные полномочия дают пользователю возможность выполнять действия с конкретной таблицей, представлением, материализованным представлением, последовательностью, процедурой, функцией или пакетом. Следовательно, всем пользователям базы данных нужны объектные полномочия.

Для выдачи объектных полномочий можно использовать следующие SQL-операторы.

  • ALTER
  • SELECT
  • DELETE
  • EXECUTE
  • INSERT
  • REFERENCES
  • INDEX

Пример:

GRANT SELECT, UPDATE
ON table_name TO scott;


Основные представления привилегий пользователей:

ROLE_SYS_PRIVS - Системные привилегии, предоставленные ролям.
ROLE_TAB_PRIVS - Привилегии на таблицы, предоставленные ролям.
USER_ROLE_PRIVS - Роли, доступные пользователю.
USER_TAB_PRIVS_MADE - Объектные привилегии, которые пользователь предоставил на свои объекты.
USER_TAB_PRIVS_RECD - Объектные привилегии, предоставленные пользователю.
USER_COL_PRIVS_MADE - объектные привилегии, которые пользователь предоставил на столбцы своих объектов.
USER_COL_PRIVS_RECD - Объектные привилегии, предоставленные пользователю на столбцы чужих объектов.
USER_SYS_PRIVS - Перечень системных привилегий предоставленных пользователю.


Получить список всех ролей, системных и объектных привилегий пользователя. (Запускается под учетной записью пользователя)

Способ 1:

SET feedback off
SET serveroutput ON

BEGIN
  dbms_output.enable(100000);
  dbms_output.put_line('-- Fetching roles');
  FOR i IN (SELECT username, granted_role FROM user_role_privs) LOOP
    dbms_output.put_line('grant '||i.granted_role||' to '||i.username||';');
  END LOOP;
  dbms_output.put_line('-- Fetching system privileges');
  FOR i IN (SELECT username, privilege FROM user_sys_privs) LOOP
    dbms_output.put_line('grant '||i.privilege||' to '||i.username||';');
  END LOOP;
  dbms_output.put_line('-- Fetching object privileges');
  FOR i IN (SELECT grantee, owner, table_name, privilege FROM user_tab_privs) LOOP
    dbms_output.put_line('grant '||i.privilege||' on '||i.owner||'.'||i.table_name||' to '||i.grantee||';');
  END LOOP;
END;
/



Result:

grant UNLIMITED TABLESPACE to PLSQL_PROJECT;
grant CREATE SESSION to PLSQL_PROJECT;
grant CREATE TABLE to PLSQL_PROJECT;

Способ 2:

Our task is get all privileges granted for user and create report based on this information. As you know privileges gives on user directly or on his role. Privileges divided by 2 part: system and object.

Let see example, create report for user Scott

1.Create repository table for store data:

create table vm_user_privs(privilege varchar2(100),user_name varchar2(100),object_name varchar2(100));

2. Main script:

declare
cursor c_user is
select distinct(a.username) from dba_users a
where a.username='SCOTT';
p_user varchar2(100);

begin
open c_user;
loop
fetch c_user into p_user;
insert into vm_user_privs
select /*+ rule */ a.privilege,p_user,a.table_name from dba_tab_privs a where a.grantee=p_user
union all
select /*+rule */ b.privilege,p_user,b.table_name from dba_tab_privs b where b.grantee in (select b1.granted_role from dba_role_privs b1 where b1.grantee=p_user)
union all
select /*+ rule */ c.privilege,p_user,null from dba_sys_privs c where c.grantee=p_user
union all
select /*+rule */ d.privilege,p_user,null from dba_sys_privs d where d.grantee in (select b2.granted_role from dba_role_privs b2 where b2.grantee=p_user);
commit;
EXIT WHEN c_user%NOTFOUND;
end loop;
close c_user;
end;

3. See result:

select * from vm_user_privs

Thank’s to
http://ocp.community.ge/post/Script-generate-all-user-privileges-in-one-report.aspx