2013-12-17 60 views
0

我有兩個表mainhist。我想,只要它的日期時間列修改爲histmain表複製一行,並重新在mainnull修改colums,除了一列。不過,我得到突變觸發錯誤。請幫忙。 下面是兩個觸發器,不同誘變觸發甲骨文

CREATE OR REPLACE TRIGGER INS_HIS 
AFTER UPDATE OF datetime ON main 
FOR EACH ROW 
    INSERT INTO HIST 
    VALUES (Col2 = :new.col2, Col3= :new.Col3) 
END; 


CREATE OR REPLACE TRIGGER UPD_NUL_MAIN 
AFTER INSERT ON HIST 
FOR EACH ROW 
    UPDATE Main 
     SET (Col2 = NULL 
      Col3= NULL) 
    WHERE HIST.datetime = main.datetime; 
END 
+0

嘿羅布,我認爲錯誤是第二觸發,列複製到HIST表,但之後,當它具有使主列爲空它不工作。 – user3110283

+0

是的 - 我看到了我的方式錯誤(我沒有注意到數據時間後更新),並刪除了原來的評論。 –

回答

2

假設你想改變只在主行觸發更新,你可以擺脫第二觸發的完全如果你改變你的第一個觸發器的BEFORE UPDATE之一,設置COL2和COL3有:

CREATE OR REPLACE TRIGGER INS_HIS 
BEFORE UPDATE OF datetime ON main 
FOR EACH ROW   
BEGIN 
    INSERT INTO HIST 
    (col2, 
    col3) 
    VALUES 
    (:new.col2, 
    :new.Col3); 
    :new.col2 := NULL; 
    :new.col3 := NULL; 
END; 

BTW:你的觸發器語法是錯誤的 - 你不能使用(COL2 =:new.col2)。

+0

道歉 - 在撰寫帖子期間分心,看起來我已經提交了重複的答案! –

+0

沒有問題,發生在我身上所有的時間:-) –

+0

喔啊你是對的生根粉語法,是我不好,但在相同觸發空的事情不會發生 – user3110283

1

爲了做到這一點,我認爲你只需要一個觸發器?

CREATE OR REPLACE TRIGGER ins_his BEFORE UPDATE OF datetime ON main 
FOR EACH ROW 
BEGIN 

    INSERT INTO hist (col2  , col3  ) 
      VALUES (:new.col2, :new.col3); 

    :new.col2 := NULL; 
    :new.col3 := NULL; 

END; 
/

輸出示例:

SQL*Plus: Release 11.2.0.1.0 Production on Tue Dec 17 13:17:08 2013 

Copyright (c) 1982, 2010, Oracle. All rights reserved. 


Connected to: 
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
With the Partitioning, Real Application Clusters, Automatic Storage Management, 
OLAP, 
Data Mining and Real Application Testing options 

SQL> create table main (datetime DATE, col2 NUMBER, col3 NUMBER); 

Table created. 

SQL> create table hist (col2 NUMBER, col3 NUMBER); 

Table created. 

SQL> CREATE OR REPLACE TRIGGER ins_his BEFORE UPDATE OF datetime ON main 
    2 FOR EACH ROW 
    3 BEGIN 
    4 -- 
    5 INSERT INTO hist (col2  , col3  ) 
    6    VALUES (:new.col2, :new.col3); 
    7 -- 
    8 :new.col2 := NULL; 
    9 :new.col3 := NULL; 
10 -- 
11 END; 
12/

Trigger created. 

SQL> insert into main(datetime, col2, col3) 
    2 values (sysdate, 5, 10); 

1 row created. 

SQL> select * from main; 

DATETIME  COL2  COL3 
--------- ---------- ---------- 
17-DEC-13   5   10 

SQL> select * from hist; 

no rows selected 

SQL> update main set datetime = sysdate-1; 

1 row updated. 

SQL> select * from main; 

DATETIME  COL2  COL3 
--------- ---------- ---------- 
16-DEC-13 

SQL> select * from hist; 

     COL2  COL3 
---------- ---------- 
     5   10 

SQL> 
+0

你確定這是否適用於AFTER UPDATE觸發器(而不是BEFORE UPDATE觸發器)? –

+0

啊我不認爲我們可以在相同的觸發器中將值更改爲null。它不會發生,因爲事件在主表上 – user3110283

+0

與上面的答案一樣。你真的*嘗試過嗎? –