Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

Как получить привилегии поьзователя (допустим на SELECT).   Найти похожие ветки 

 
tytus   (2006-09-07 14:35) [0]

Пишу так:
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 14:47) [1]


> tytus   (07.09.06 14:35)

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


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

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


 
ANB ©   (2006-09-07 15:23) [3]

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


 
ANB ©   (2006-09-07 15:30) [4]

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


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

>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 17:00) [6]

G - with Grant option
A - with Admin option

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


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

>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_privs WHERE 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 пишет, что функция создалась с ошибками.


 
evvcom ©   (2006-09-07 17:17) [8]

> [7] tytus   (07.09.06 17:11)

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


 
ANB ©   (2006-09-07 17:24) [9]


> sys.dba_role_privs

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

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


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

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


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

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


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

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


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

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


 
ANB ©   (2006-09-07 18:03) [14]


> tytus   (07.09.06 17:41) [13]

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


 
ANB ©   (2006-09-07 18:13) [15]

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) [16]

Заюзать :

select ANB.getprivtablesel("table1") from dual



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.033 c
2-1161345479
Alex_C
2006-10-20 15:57
2006.11.05
EMcaretPos в RichEdit


5-1142499037
Arm79
2006-03-16 11:50
2006.11.05
ошибка при обращении к Parameters наследника TADOStoredProc


2-1161173448
Sco
2006-10-18 16:10
2006.11.05
Как удалить предок компонента из его же события


3-1157371577
ANB
2006-09-04 16:06
2006.11.05
Кто понимает смысл ошибки "Таблица мутирует" ?


2-1161069191
Батя
2006-10-17 11:13
2006.11.05
Типа listbox a только в место текста картинки