спасибо @hol, @ Алекс Пул, я думаю, что взломал это.Я использую триггер для вставки данных в VALID_FROM каждый раз, когда что-либо добавляется:
CREATE TABLE "DIM_TEST" ( "COL_1" VARCHAR2(20 BYTE), "VALID_UNTIL" TIMESTAMP (6),
"DIM_TEST_PK" NUMBER, "VALID_FROM" TIMESTAMP (6) DEFAULT NULL)
create or replace TRIGGER T_DIM_TEST_DATE_INSERT
BEFORE INSERT ON DIM_TEST
FOR EACH ROW
BEGIN
:new.VALID_FROM := sysdate;
END;
и для части, которая обновляет предыдущую строку VALID_FROM при добавлении дубликата, у меня есть следующий триггер:
create or replace TRIGGER TABLE_UPDATE
after INSERT or update
ON DIM_TEST
FOR EACH ROW
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
IF INSERTING
THEN
MERGE INTO DIM_TEST T_1
USING (select :new.COL_1 from DUAL) T_2
ON (T_1.COL_1 = :new.COL_1)
WHEN MATCHED THEN
UPDATE
SET T_1.VALID_UNTIL = (SYSDATE)
WHERE T_1. VALID_UNTIL is null;
--AND T_1. VALID_FROM <> (SELECT max(VALID_FROM) FROM DIM_TEST);
END IF;
COMMIT;
END;
Единственным недостатком является то, что если существующая строка обновляется до дубликата, то второй триггер не сработает из-за предложения IF INSERTING ... когда я изменяю его на IF INSERTING или UPDATING, тогда он будетсоздать бесконечный цикл ... но я могу ограничить пользователей только вставками, поэтому это не должно быть проблемой.