powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с триггером BEFORE DELETE!
25 сообщений из 37, страница 1 из 2
Помогите с триггером BEFORE DELETE!
    #39792128
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи!
Есть 2 таблицы:
TABLE1: id, col1, col2, col3
TABLE2: id, sv_id, col1, col2

Таблицы связаны между собой, TABLE1 основная, в TABLE2 связанное поле sv_id, если запись в TABLE1 удаляется, то удаляются все записи в TABLE2.

Идея перед удалением копировать данные в отдельные таблицы TABLE1BC и TABLE2BC соответственно.

По TABLE1 все просто, создал таблицу TABLE1BC делаю триггер:
create or replace TRIGGER BACK_DELETE
BEFORE DELETE ON TABLE1
FOR EACH ROW
BEGIN
insert into TABLE1BC( id, col1, col2, col3)
values(
:old.id,
:old.col1,
:old.col2,
:old.col3)
END;
А вот каким образом скопировать данные из связанной таблицы TABLE2 притом, что в ней записей, относящихся к TABLE1 может быть несколько и записи в TABLE2 могут также удаляться пользователями независимо от TABLE1.
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792168
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl,

то удаляются все " связанные " записи (cascade)?

1) Виставлять флажок
2) Проверять стек вызова (имхо долго)

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792173
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxJavl,

то удаляются все " связанные " записи (cascade)?

1) Виставлять флажок
2) Проверять стек вызова (имхо долго)

.....
stax

Да, удаляются все связанные по полю ID_SV

У меня были разные мысли, запуск процедуры..., но может опытные форумчане подскажут как правильно?
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792185
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl,

create flashback archive
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792198
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-Javl,

create flashback archive

На сколько я понимаю туда будут попадать все удаляемые записи, а смысл немного в другом...
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792307
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StaxJavl,
2) Проверять стек вызова (имхо долго)
.....
stax
сорррри

со стеком я возможно приврал (поспешил не проверив)

зы
остается выставлять фражок в триггере для TABLE1

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792329
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javlи записи в TABLE2 могут также удаляться пользователями независимо от TABLE1.второй триггер на TABLE2
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792330
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tusJavlи записи в TABLE2 могут также удаляться пользователями независимо от TABLE1.второй триггер на TABLE2

Туда будут попадать все удаляемые записи, а надо только те, которые связаны с удаленными из TABLE1.

Была мысль, писать все, а потом отбирать и ненужные удалять, но это грабли.
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792334
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl надо только те, которые связаны с удаленными из TABLE1.
JavlТаблицы связаны между собой

Я прям запутался. Кто на ком стоял?
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792338
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous Кто на ком стоял?

имхо
если в TABLE2 строки удяляются "каскадно" (delete table1), то их надо сохранять в TABLE2BC,
если напрямую (delete table2), то сохранять не надо

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792348
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl,

у вас от TABLE2.sv_id внешний ключ более чем на одну (TABLE1) таблицу ?
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792370
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxandrey_anonymous Кто на ком стоял?

имхо
если в TABLE2 строки удяляются "каскадно" (delete table1), то их надо сохранять в TABLE2BC,
если напрямую (delete table2), то сохранять не надо

.....
stax

Для ясности, пусть TABLE1 это Сотрудник, а TABLE2 Документы

При работе через программу, пользователи могут удалять отдельные документы, а если они удаляют Сотрудника (Иванова Ивана Ивановича), то удаляются все его (связанные) документы.
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792371
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tusJavl,

у вас от TABLE2.sv_id внешний ключ более чем на одну (TABLE1) таблицу ?

В TABLE2 поле SV_ID только ID из TABLE1 и все!
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792375
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavlПри работе через программу, пользователи могут удалять отдельные документы, а если они удаляют Сотрудника (Иванова
Ивана Ивановича), то удаляются все его (связанные) документы.
.. и требуется сохранить... что и в каком случае?
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792378
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymousJavlПри работе через программу, пользователи могут удалять отдельные документы, а если они удаляют Сотрудника (Иванова
Ивана Ивановича), то удаляются все его (связанные) документы.
.. и требуется сохранить... что и в каком случае?

В TABLE1BC сохраняется удаляемая запись из TABLE1 (к Примеру Иванов Иван Иванович), а в TABLE2BC должны сохраниться все записи из TABLE2 связанные с удаляемой записью из TABLE1 (документ1, документ2, документ3 у которых в поле SV_ID прописан ID Иванова)
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792380
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavlДля ясности

я ето понимаю

поетому предлагаю выставлять/снимать флажок в триггере на табле1,
и проверять его (есле установлен копируем) в триггере табле2

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792383
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxJavlДля ясности

я ето понимаю

поетому предлагаю выставлять/снимать флажок в триггере на табле1,
и проверять его (есле установлен копируем) в триггере табле2

.....
stax

Триггер создан в TABLE1, он не видит, если в нем прописывать TABLE2, я пробовал так в самом начале
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792393
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavlТриггер создан в TABLE1, он не видит, если в нем прописывать TABLE2, я пробовал так в самом начале

флажок ВЫСТАВЛЯТЬ в триггере

флажком может быть
1) пакетная переменная
2) контекст
3) поле в таблице
4) последовательность
...
999) еще что-то

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792401
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl,

логику на флажке могу для примера нарисовать но

Javlно может опытные форумчане подскажут как правильно?

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792409
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
StaxJavl,

логику на флажке могу для примера нарисовать но

Javlно может опытные форумчане подскажут как правильно?

.....
stax

Да, интересно, объясните!
У меня вопрос, а что дальше т.е. сработал флажок и...
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792444
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут проблема может быть в том, что при каскадном удалении сначала срабатывают триггеры дочерних таблиц, а затем уже родительских. Т.е. флаг будет взведен тогда, когда уже все будет сделано и надобность в нем отпадет. Рекомендую залогировать последовательность вызова всех BEFORE и AFTER триггеров на обе таблицы при удалении записи в родителе. И от этого уже плясать.

А вообще - триггеры и прямые DML команды из клиента - зло. Приучайтесь делать все через процедуры, тогда все такие моменты сразу отпадут.
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792450
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Javl,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
SQL> desc parent_table;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                        NOT NULL NUMBER(38)
 N                                                  VARCHAR2(10)

SQL> desc child_table;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(38)
 ID_P                                               NUMBER(38)
 C                                                  VARCHAR2(10)

SQL> create or replace TRIGGER B_PARENT_DELETE_FLAG
  2  BEFORE DELETE ON PARENT_TABLE
  3  BEGIN
  4   flag_on_delete_parent.flag:=true;
  5  END;
  6  /

Trigger created.


SQL> create or replace TRIGGER A_PARENT_DELETE_FLAG
  2  AFTER DELETE ON PARENT_TABLE
  3  BEGIN
  4   flag_on_delete_parent.flag:=false;
  5  END;
  6  /

Trigger created.
SQL> create or replace TRIGGER BACK_DELETE_CHILD
  2  BEFORE DELETE ON child_table
  3  FOR EACH ROW
  4  BEGIN
  5  if flag_on_delete_parent.flag then
  6   --insert into TABLE2BC ...
  7   dbms_output.put_line('Delete cascade child_table '||:old.id);
  8  end if;
  9  END;
 10  /

Trigger created.

SQL> select * from child_table;

        ID       ID_P C
---------- ---------- ----------
        10          1 Doc1
        20          1 Doc2
        30          1 Doc3

SQL> select * from PARENT_TABLE;

        ID N
---------- ----------
         1 Javl

SQL> delete child_table where id=20;

1 row deleted.

SQL> delete parent_table;
Delete cascade child_table 10
Delete cascade child_table 30

1 row deleted.

SQL>



ps
минус - умники могут сбросить пакетную переменную

.....
stax
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792457
Javl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Александр СпелицинТут проблема может быть в том, что при каскадном удалении сначала срабатывают триггеры дочерних таблиц, а затем уже родительских. Т.е. флаг будет взведен тогда, когда уже все будет сделано и надобность в нем отпадет. Рекомендую залогировать последовательность вызова всех BEFORE и AFTER триггеров на обе таблицы при удалении записи в родителе. И от этого уже плясать.

А вообще - триггеры и прямые DML команды из клиента - зло. Приучайтесь делать все через процедуры, тогда все такие моменты сразу отпадут.

Проблема в том, что клиент это купленная программа и влезть в нее нет возможности.
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792662
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а триггер обязательно нужен? может правильнее написать процедуру для этого процесса вместо оператора Delete и все необходимое в этой процедуре сделать
...
Рейтинг: 0 / 0
Помогите с триггером BEFORE DELETE!
    #39792683
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex-lsа триггер обязательно нужен? может правильнее написать процедуруКак можно не прочитать строчкой выше?
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с триггером BEFORE DELETE!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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