業務表 USERTEST 異動(增/刪/改)需即時同步至備份表 USERTEST_TEMP,結構完全一致。
CREATE TABLE USERTEST (
NAME VARCHAR2(20) NOT NULL,
AGE NUMBER,
ISDELETE VARCHAR2(4)
);
CREATE TABLE USERTEST_TEMP (
NAME VARCHAR2(20) NOT NULL,
AGE NUMBER,
ISDELETE VARCHAR2(4)
);
CREATE OR REPLACE TRIGGER TR_USER_TEMP
BEFORE INSERT OR UPDATE OR DELETE ON USERTEST
FOR EACH ROW
DECLARE
BEGIN
IF INSERTING THEN
INSERT INTO USERTEST_TEMP (NAME, AGE, ISDELETE)
VALUES (:NEW.NAME, :NEW.AGE, :NEW.ISDELETE);
ELSIF DELETING THEN
DELETE FROM USERTEST_TEMP WHERE NAME = :OLD.NAME;
ELSIF UPDATING THEN
UPDATE USERTEST_TEMP
SET AGE = :NEW.AGE, ISDELETE = :NEW.ISDELETE
WHERE NAME = :OLD.NAME;
END IF;
END;
/
-- 注意:標點必須為英文半角,否則編譯報錯
| 子句 | 說明 |
|---|---|
BEFORE / AFTER | 觸發時機:操作前/後。BEFORE 可修改 :NEW 值、阻止操作 |
FOR EACH ROW | **行級觸發器**:每受影響一行觸發一次。省略則為**語句級**,整條 SQL 觸發一次 |
:NEW / :OLD | 偽記錄::NEW 為操作後值,:OLD 為操作前值。INSERT: NEW有/OLD無 | UPDATE: 皆有 | DELETE: NEW無/OLD有 |
WHEN | 行級觸發器可加條件過濾,減少無效觸發 |
:NEW/:OLD 不能引用 LONG/BLOB 欄位INSERT INTO USERTEST VALUES ('Alice', 25, 'N');
UPDATE USERTEST SET AGE=26 WHERE NAME='Alice';
DELETE FROM USERTEST WHERE NAME='Alice';
SELECT * FROM USERTEST_TEMP; -- 應與 USERTEST 同步
SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_NAME, STATUS
FROM USER_TRIGGERS;