![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить привилегии поьзователя (допустим на 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. Те таблицы, к которым ты не имеешь права на селект, в ней не отобразятся.