2011-03-02 133 views
3

全部, 我只是試圖創建一個觸發器,將從TABLE EMP中選擇一個完整的記錄,並將其插入TABLE EMP_ARCHIVE上的UPDATE嘗試(顧名思義,EMP_ARCHIVE表只是一個歷史記錄表來存儲郵件EMP表中所做的更改)。兩個表都有相同的字段/列。以下是我嘗試創建的觸發器。我知道有什麼不對,但無法弄清楚。它拋出錯誤的「(」以下INSERT命令任何幫助,將不勝感激 原諒我,如果有一些根本性的錯誤,因爲我是一個新手,這些ORACLE觸發器INSERT更新

CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active 
    ) 
    SELECT 
     :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active 
    FROM EMP 
    WHERE emp_id = :old.emp_id 
END; 
+0

您的語法錯誤是Select需要圍繞它的括號。雖然,a_horse_with_no_name提供了正確的答案。你根本不需要SELECT。 – Mikezx6r 2011-03-02 19:54:01

+2

包含實際的錯誤消息(ORA-xxxxx錯誤號和錯誤文本)通常會有所幫助。有時候錯誤會跳出來,但沒有其他時間,錯誤是非常有用的信息。 – 2011-03-02 19:54:26

回答

6

無需從表中選擇。:

 
CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active 
    ) 
    VALUES 
    ( :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active 
    ); 
END; 

BTW:在甲骨文11,你可以完全自動完成這個由這些表創建一個閃回存檔中沒有觸發或任何其他麻煩

+0

在11g之前,Workspace Manager也可用於自動跟蹤歷史信息。 – 2011-03-02 19:54:59

+0

@Justin:是的,但查詢信息並不容易。使用閃回檔案你可以做一個'SELECT * FROM some_table AS TIMESTAMP TIMESTAMP'2005-06-28 14:38:12'' – 2011-03-02 19:59:50

+0

你在INSERT之後加了分號嗎?你用哪個工具運行這個?在SQLPlus中,你需要在一行中用'/'來終止它。在你使用SQL * Plus的時候複製和粘貼(作爲編輯的問題)可能是一個好主意。 – 2011-03-02 20:14:06

0

我知道這是一個有點老問題,但是想通我把。另一個想法,爲其他任何人com在這個問題上,就像我剛纔那樣。在過去,我在做同樣的存檔過程時做了以下事情。

CREATE OR REPLACE TRIGGER Save_EMP_Changes 
BEFORE UPDATE ON EMP 
FOR EACH ROW 
BEGIN 
    INSERT INTO EMP_ARCHIVE 
    (
     emp_id, emp_name, 
     emp_age, emp_sex, 
     emp_active, revision_cnt 
    ) 
    SELECT 
     :old.emp_id, :old.emp_name, 
     :old.emp_age, :old.emp_sex, 
     :old.emp_active, nvl(max(revision_cnt)+1, 1) 
    FROM EMP 
    WHERE emp_id = :old.emp_id 
END; 

HTH others。