Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить привилегии поьзователя (допустим на SELECT). [D7]


tytus ©   (2006-09-07 14:35:00) 

Пишу так:
declare
 ARole varchar2(50);
 AUser varchar2(20);
cursor mcur is
 select * from dba_role_privs WHERE GRANTEE=AUser;
cursor tabpriv is
 select * from table_privileges where TABLE_NAME='MAINTABLE' and GRANTEE=ARole;
begin
AUser:='ADMIN';
 for cursorrec in mcur
   loop
     ARole:=cursorrec.GRANTED_ROLE;
     dbms_output.put_line(ARole);
 for cursorrec in tabpriv
   loop
     if cursorrec.SELECT_PRIV='Y' then
       dbms_output.put_line('SELECT=Y');
     end if;                
  end loop;
   end loop;
end;
Выводит
AQ_ADMINISTRATOR_ROLE
DBA
SIMPLEROLE     --своя роль
SELECT=Y
SROLE            --своя роль
SELECT=Y
А есть ли способ по-проще? Напишите плиз.


ANB   (2006-09-07 18:13:00) [1]

CREATE OR REPLACE FUNCTION getprivtablesel (p_table_name VARCHAR2)
  RETURN VARCHAR2
IS
  v_r   VARCHAR2 (2);
BEGIN
  SELECT MIN (select_priv)
    INTO v_r
    FROM table_privileges
   WHERE owner = 'ANB' AND table_name = UPPER (p_table_name);

  RETURN v_r;
END;


ANB   (2006-09-07 18:13:00) [2]

Заюзать :

select ANB.getprivtablesel('table1') from dual


ANB   (2006-09-07 18:03:00) [3]


> tytus   (07.09.06 17:41) [13]

Хренью занимаешься


tytus   (2006-09-07 17:41:00) [4]

>
добавил select_any_table в System Privileges - прошло.


tytus   (2006-09-07 17:28:00) [5]

>ANB
grant dba to ADMIN with admin option; уже было. Это ОНО?


tytus   (2006-09-07 17:25:00) [6]

>evvcom
а как сие сотворить?
Править пользователя -> Object Privileges или System Privileges?


ANB   (2006-09-07 17:25:00) [7]

Да и table_privileges автоматически выдает инфу от пользователя, под которым ты хранимку выполняешь.


ANB   (2006-09-07 17:24:00) [8]


> sys.dba_role_privs

Ну и нафига ? На dba_% вьюхи надо прямые гранты хозяину твоей процедуры давать.

Кстати, кроме user_tab_privs есть еще all_tab_privs. Никаких проблем через нее работать.


evvcom   (2006-09-07 17:17:00) [9]

> [7] tytus   (07.09.06 17:11)

Дык, у тебя прямые полномочия должны быть на эту sys.dba_role_privs (не через роль!)


tytus   (2006-09-07 17:11:00) [10]

>ANB
Спасибо.
Вот наваял функцию, но девелоперу не нравится.
create or replace function CheckUserRoles(AUserName in varchar2,
ATableName in varchar2) return boolean is
--  Result boolean;

 ARole varchar2(50);
cursor mcur is
 select * from sys.dba_role_privsWHERE GRANTEE=AUserName;
cursor tabpriv is
 select * from table_privileges where TABLE_NAME=ATableName and GRANTEE=ARole;
begin
 Result:=false;
 for cursorrec in mcur
   loop
     ARole:=cursorrec.GRANTED_ROLE;
 for cursorrec in tabpriv
   loop
     if (cursorrec.INSERT_PRIV='Y')or(cursorrec.INSERT_PRIV='A') then
       Result:=true;
     end if;                
  end loop;
   end loop;  
 return(Result);
end CheckUserRoles;
Там где жирно, там не нравится. PLS-00201
В Command Window пишет, что функция создалась с ошибками.


ANB   (2006-09-07 17:00:00) [11]

G - with Grant option
A - with Admin option

Кстати, учти, что если есть грант через роль и напрямую, то записи дублятся


tytus   (2006-09-07 16:33:00) [12]

>ANB
а что за значение "A" в таблице , если выполнить
select * from table_privileges where TABLE_NAME='MAINTABLE' в PL/SQL Dev.

GRANTEE        | OWNER |TABLE_NAME|GRANTOR|SEL_PRIV|INS_PRIV|DEL_PRIV  
MPOWER_ROLE|ADMIN   |MAINTABLE   |  ADMIN Y ->A Y

UPD_PRIV|
A
и так дал...


ANB   (2006-09-07 15:30:00) [13]

А для уточнения для какой схемы есть права - поле OWNER
Короче
select * from table_privileges
показывает все таблицы, которые ты можешь прочитать. С расшифровкой, у кого, имя таблицы, права развернуто, кто дал (напрямую или через роль).


ANB   (2006-09-07 15:23:00) [14]

проще будет проверять по имени таблицы, не припутывая роли. Они там справочно идут.


tytus   (2006-09-07 14:56:00) [15]

[1]
не совсем то, может неточно задал вопрос.
Я хочу создать процедуру, которая по имени таблицы и имени пользователя, проверит  ту или инную привилегию в зависимости от присвоенной роли. Этот пример - тестовый способ проверки. Нужно будет проверять привелегию на добавление записи и т.п.
Хотелось бы способ по-проще, если таковой есть...


ANB   (2006-09-07 14:47:00) [16]


> tytus   (07.09.06 14:35)

самый простой способ в твоем случае - дернуть вьюху all_tables. Те таблицы, к которым ты не имеешь права на селект, в ней не отобразятся.


Наверх

Титульная страница Поиск, карта сайта Написать письмо