Получить: НОВЫЙ стол в ПЕРЕД УДАЛЕНИЕМ - PullRequest
0 голосов
/ 07 июня 2019

При создании триггера в Oracle есть возможность использовать новые и старые значения, если триггер для FOR EACH ROW.

Мне нужно это для всей таблицы, потому что я не использую FOR EACH ROW.

У меня есть две таблицы: Table1: User_Hist (ID, EID, NAME, VALID_FROM) Table2: Пользователь (ID, NAME, VALID_FROM)

В Table2 есть ограничение внешнего ключа USER (ID, VALID_FROM)) ССЫЛКИ USER_HIST (EID, VALID_FROM)

В таблице User_Hist хранится вся информация о пользователе с течением времени.В пользовательской таблице должен храниться только самый новый пользователь.

Если удалить самую новую строку, ограничение остановит это.

Так что моя идея состоит в том, чтобы обновить пользователя таблицы в TRIGGER.

В триггере BEFORE DELETE для User_Hist будет инструкция MERGE, которая обновляет пользователя таблицы.Но мне нужно, какие строки удаляются, лучше всего будет: НОВАЯ таблица.

Может ли кто-нибудь последовать моему объяснению ...

Может быть, это поможет

User_hist:
ID ... EID ..... NAME ................. VALID_FROM
1 ..... 1 ....... Сара Саммер ..... 2010-01-01
2 ..... 1 ....... Сара Миллер .......... 2013-01-01

ПОЛЬЗОВАТЕЛЬ до удаления ID2:
ID ..... ИМЯ .............. VALID_FROM
1 ...... Сара Миллер ..... 2013-01-01

ПОЛЬЗОВАТЕЛЬ после удаления ID2:
ID ..... ИМЯ .................. VALID_FROM
1 ...... Sarah Summer ..... 2010-01-01

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

1 Ответ

0 голосов
/ 07 июня 2019

Вам понадобится составной триггер, подобный этому:

CREATE OR REPLACE TRIGGER user_trigger
   FOR DELETE ON USER_HIST
   COMPOUND TRIGGER

TYPE IdTableType IS TABLE OF USER_HIST.EID%TYPE;
IdTable IdTableType;

BEFORE STATEMENT IS   
    -- Initialize IdTable 
    BEGIN       
        IdTable := IdTableType();
    END BEFORE STATEMENT;

BEFORE EACH ROW IS   
    -- Add deleted rows to IdTable 
    BEGIN       
        IdTable.EXTEND;
        IdTable(IdTable.LAST) := :OLD.EID;
    END BEFORE EACH ROW;

AFTER STATEMENT IS 
    -- Process each row after statement
    BEGIN
       FOR i IN IdTable.FIRST..IdTable.LAST LOOP
           -- Do whatever you need for your row
           ...
           WHERE EID = IdTable(i);
       END LOOP;
    END AFTER STATEMENT;    

END;
/

Возможно, вам нужно добавить больше столбцов из таблицы USER_HIST, чтобы выполнить ваши требования. Но я полагаю, у вас есть принцип.

...