Цитата: Mtirt ➤ Если бы разговор шел о двух десятках должностей, согласилась бы...
Но там явно не больше 3-5 штук. Причем скорей всего можно на время ревизии их все свести к одной должности...
Просто разбираться с SMGrantedFunctions по-моему еще геморойнее.
Это кривее геморроя.
Вот решение. И без геморроя. Пользуйтесь на здоровье.
declare
Access_Checked number;
Set_Value supermag.smgrantedfunctions.daysbefore%type;
cursor Grant_Function_Cursor (Access in number)
is
/* функции модулей, привязанных к должностям */
select u.id posid, a.functionid
from supermag.smoffcfg u
, supermag.smgrantedmodules m
, supermag.smappaccess a
, supermag.smgrantedfunctions f
where u.orarole not in ('admin','SUPERMAG_ADMIN_GROUP')
and m.posid = u.id
and a.appid = m.appid
/* Модули: 6 ("Карточки складского учета"), 12 ("Отчеты") */
and m.appid in (6,12)
and a.functionid in (620,606,1205,1239,1279,1284,1295)
and f.posid = u.id
and f.funcid = a.functionid
and decode (f.daysbefore, 0, 0, 1) = Access;
r Grant_Function_Cursor%rowtype;
begin
select 1 into Access_Checked from dual;
select 0 into Set_Value from dual;
if :New_Access = 1 then
select 0 into Access_Checked from dual;
select null into Set_Value from dual;
end if;
/* установка доступа к функциям */
open Grant_Function_Cursor (Access_Checked);
loop
Fetch Grant_Function_Cursor into r;
Exit When Grant_Function_Cursor%Notfound;
update supermag.smgrantedfunctions t
set t.daysbefore = Set_Value
where t.posid = r.posid
and t.funcid = r.functionid;
end loop;
close Grant_Function_Cursor;
/* установка доступа к модулю 28 ("Остатки") */
update supermag.smgrantedmodules t
set t.daysbefore = Set_Value
where t.appid = 28
and t.posid in
(
select u.id
from supermag.smoffcfg u
, supermag.smgrantedmodules m
where u.orarole not in ('admin','SUPERMAG_ADMIN_GROUP')
and m.posid = u.id
and m.appid = 28
);
exception
When others then
If Grant_Function_Cursor%IsOpen Then
Close Grant_Function_Cursor;
end if;
end;