powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каскадный (вверх) триггер. Выдает ошибку End of Table
4 сообщений из 4, страница 1 из 1
Каскадный (вверх) триггер. Выдает ошибку End of Table
    #32067875
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
declare
 parent_id integer;
 dquery_user varchar2( 15 );
 dquery_grant_id integer;
begin
if :new.dquery_grant_id is null then
 select sq_sm_dquery_grant_id.nextval into :new.dquery_grant_id from dual; 
end if; 

 /* Необходимо написать хэндлер для каскадного изменения вверх */ 
 /* Для этого мы должны узнать PARENT_ID от :new.dquery_id и если на него грант 
   не установлен, то его надо будет установить   */ 
select a.DQUERY_PARENT_ID, a.DQUERY_USER into parent_id,dquery_user from SM_DQUERY a where a.DQUERY_ID=:new.DQUERY_ID;
 /* Если у родителя таких привелегий не имеется, то устанавливаем их в случае, если я являюсь создателем */ 
if parent_id is not null and dquery_user=USER then 
 select  a.DQUERY_GRANT_ID into dquery_grant_id from  SM_DQUERY_GRANT a where a.DQUERY_ID=parent_id and a.DQUERY_USER = :new.DQUERY_USER;
 if dquery_grant_id is null then
  insert into SM_DQUERY_GRANT  (DQUERY_ID,DQUERY_USER)  VALUES (parent_id,:new.DQUERY_USER);
 end if; 
end if;
   

end;


Помогите разобраться .......... Возможный трабл - не на каждого юзеря есть запись в таблице Sm_DQUERY_GRANT
поэтому иногда должен возвращаться null

Oracle юзаю недавно ........ триггеры писал только на автоинкремент .....


Спасибо
...
Рейтинг: 0 / 0
Каскадный (вверх) триггер. Выдает ошибку End of Table
    #32067931
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опишу проблему ......
В таблице SM_DQUERY хранится дерево
К каждому узлу дерева привязаны записи из другой таблицы которые представляют из себя привелегии на доступ к этому дереву.

Если я даю привелегию некому пользователю в нижнем узле дерева, то данная привелегия должна быть автоматически дана родительским узлам дерева.

В вышеуказанном триггере на BEFORE INSERT я пытаюсь это реализовать ......

но выдает ошибку End of Table......

Не подскажете в чем причина ?
...
Рейтинг: 0 / 0
Каскадный (вверх) триггер. Выдает ошибку End of Table
    #32067958
Василий Алибабаевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос снят .......

Окончательная версия триггера:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare
 parent_id integer;
 dquery_user varchar2( 15 );
 dquery_grant_id integer;
begin
if :new.dquery_grant_id is null then
 select sq_sm_dquery_grant_id.nextval into :new.dquery_grant_id from dual; 
end if; 

 /* Необходимо написать хэндлер для каскадного изменения вверх */ 
 /* Для этого мы должны узнать PARENT_ID от :new.dquery_id и если на него грант 
   не установлен, то его надо будет установить   */ 
 select a.DQUERY_PARENT_ID, a.DQUERY_USER into parent_id,dquery_user from SM_DQUERY a where a.DQUERY_ID=:new.DQUERY_ID;
  /* Если у родителя таких привелегий не имеется, то устанавливаем их в случае, если я являюсь создателем */ 
 if parent_id is not null and dquery_user=USER then 
  begin
   select  a.DQUERY_GRANT_ID into dquery_grant_id from  SM_DQUERY_GRANT a where a.DQUERY_ID=parent_id and a.DQUERY_USER = :new.DQUERY_USER;
   EXCEPTION 
    WHEN NO_DATA_FOUND THEN
     insert into SM_DQUERY_GRANT  (DQUERY_ID,DQUERY_USER)  VALUES (parent_id,:new.DQUERY_USER);
  end;
 end if; 

end;
...
Рейтинг: 0 / 0
Каскадный (вверх) триггер. Выдает ошибку End of Table
    #32068116
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
In first: in oracle exists very powerfull constractions for work with
hierarchical structures:
see: http://otn.oracle.com/docs/products/oracle9i/doc_library/release2/server.920/a96540/queries4a.htm#2053937

2) for realisation clear tree structure in oracle table has to have no less
then 2 main fields like ...:

drop table tree_tbl ;

create table tree_tbl (
node_id number,
root_id number,
... -- any addition fields
constraint pk_the_tree primary key (node_id),
...
);

3) if you going to write reverse query from some node to root u have to use in your cursor statments like:

select node, level from tree_tbl
connect by prior root_id=node_id
start with node_id=17; // your low level node

4) now i write article about hierachical structures in oracle
it will be done (i hope)
thru 2 weeks -- russian version
thru 4 weeks -- english version
and in that article i disscuss all problems like this and muth more.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Каскадный (вверх) триггер. Выдает ошибку End of Table
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]