1、首先建立一個測試表
CREATE TABLE TestTragger( UserId int Primary Key, Name VARCHAR(10) Not Null, CreateTime Timestamp Not Null );
創建索引:(用於UserId主鍵自增)
一、old和new在Oracle中不區分大小寫;
二、old和new可以用在declare中也可以用在begin里的sql語句;(只會在begin中的sql語句里用)
三、old表示插入之前的值,new表示新插入的值。
四、new 只出現在insert和update時,old只出現在update和delete時。在insert時new表示新插入的行數據,update時new表示要替換的新數據、old表示要被更改的原來的數據行,delete時old表示要被刪除的數據。
四、for each row --行級觸發器,一般表記的會報錯,沒有深入研究
CREATE OR REPLACE TRIGGER MYUSAP //創建或替換 名稱為MYUSAP的觸發器 before INSERT OR UPDATE ON TestTragger //新增和修改執行前出發,對象目標:TestTragger表
FOR EACH ROW //行級觸發器,每影響一行觸發一次 BEGIN IF INSERTING THEN //插入數據操作 :NEW.createtime := SYSDATE; ELSIF UPDATING then //修改數據操作 :NEW.createtime := SYSDATE; END IF; END;
創建序列:
create sequence TESTTRAGGER_SQUENCE INCREMENT BY 1 -- 每次加幾個 START WITH 1 -- 從1開始計數 NOMAXVALUE -- 不設置最大值 NOCYCLE -- 一直累加,不循環 CACHE 10;
測試插入和修改數據:
insert into testtragger(userid,name) values(TESTTRAGGER_SQUENCE.Nextval,'李四'); //插入數據 select userid,name, createtime, to_char(createtime,'yyyy-mm-dd hh:mm:ss') from testtragger; //查詢數據 update testtragger set name='李四' where userid = 2; //修改數據
效果圖:先查詢現有的數據
然后執行修改操作:update testtragger set name='王五' where userid = 2;
修改完名稱,時間戳也更新到了最新修改的時間。
注意,sysdate是精確到秒的時間戳,這個一般在粗略記錄修改人的時候使用,
但是當我們是用來進行版本控制,我們需要很高的精確度,此時應該用毫秒級的時間戳:systimestamp
把觸發器中的:sysdate改為systimestamp
效果展示:
其實這里主鍵id也是可以在觸發器中進行的,代碼如下:
insert into testtragger(name) values('阿斯瑪3'); select userid,name, createtime, to_char(createtime,'yyyy-mm-dd hh24:mi:ssxff') from testtragger order by createtime ; create sequence seq_testTragger_id start with 1;--創建一個序列從1開始 CREATE OR REPLACE TRIGGER MYUSAP before INSERT OR UPDATE ON TESTTRAGGER FOR EACH ROW BEGIN IF INSERTING THEN --插入數據操作 select seq_testTragger_id.nextval into :new.UserId from dual; --:new新值 :old老值 :NEW.UserId := seq_testTragger_id.currval; --新增時為UserId賦值,利用序列自增,(oracle不支持 AUTO_INCREMENT,) :NEW.createtime := systimestamp; ELSIF UPDATING then --修改數據操作 :NEW.createtime := systimestamp; END IF; END; DROP TRIGGER MYUSAP; --刪除觸發器 DROP SEQUENCE seq_testTragger_id; --刪除序列 DELETE FROM TESTTRAGGER; --清空表
執行順序和實例效果: