Oracle筆記(九)、觸發(fā)器

1、觸發(fā)器一旦創(chuàng)建就會(huì)立刻生效,有時(shí)可能需要臨時(shí)禁用觸發(fā)器,最常見(jiàn)的原因就是涉及數(shù)據(jù)加載。
ALTER TRIGGER trigger_name [ENABLE | DISABLE];

    2、Oracle 觸發(fā)器里兩個(gè)重要的內(nèi)存邏輯表 :old 和 :new。:old 表保存的是在DML語(yǔ)句之前的數(shù)據(jù),:new 表保存的是在DML語(yǔ)句創(chuàng)建的數(shù)據(jù)。
        old    new
INSERT    -    √
DELETE    √    -
UPDATE    √    √

    3、在觸發(fā)器語(yǔ)句中不能顯式的提交/回滾事務(wù)。




一、行級(jí)觸發(fā)器
行級(jí)觸發(fā)器對(duì) DML 語(yǔ)句影響的每個(gè)行執(zhí)行一次。主要應(yīng)用保持?jǐn)?shù)據(jù)完整性。

創(chuàng)新互聯(lián)建站長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為溫州企業(yè)提供專業(yè)的做網(wǎng)站、成都網(wǎng)站建設(shè),溫州網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

例:兩表級(jí)聯(lián)更新,修改部門(mén)表編號(hào)的同時(shí)也修改員工表的部門(mén)編號(hào):
CREATE OR REPLACE TRIGGER update_dept
  /* 行級(jí)觸發(fā)器,在更新部門(mén)表操作后觸發(fā) */
  AFTER UPDATE ON deptment
  FOR EACH ROW
BEGIN
  /* new、old 表的有效利用,把舊表的id列值 更新為 新表的id列值 */
  UPDATE emp SET id=:new.id WHERE id=:old.id;
END;

UPDATE deptment SET id='yy' WHERE id='01';

SELECT * FROM deptment;
SELECT * FROM emp;


插入時(shí)利用觸發(fā)器+序列實(shí)現(xiàn)整型字段的自增:
CREATE OR REPLACE TRIGGER set_no
  BEFORE INSERT ON auto
  FOR EACH ROW
DECLARE 
  sn number(5);
BEGIN
  /* 觸發(fā)器預(yù)處理序列的值 */
  SELECT myseq.nextval INTO sn FROM dual;
  :NEW.a := sn;
END;

INSERT INTO auto VALUES(21,'dtt');
SELECT * FROM auto;
/* 插入時(shí)表a列由觸發(fā)器產(chǎn)生的值替代用戶的輸入 */



二、語(yǔ)句級(jí)觸發(fā)器
只與語(yǔ)句有關(guān),與行無(wú)關(guān),不涉及數(shù)據(jù)完整性問(wèn)題。

例如:利用觸發(fā)器記錄,記錄某表中用戶的操作(日志處理)。
CREATE OR REPLACE TRIGGER dm1_aa
  AFTER INSERT OR DELETE OR UPDATE ON aa
BEGIN
  IF INSERTING THEN
    INSERT INTO mylog VALUES(user,sysdate,'I');
  ELSEIF DELETING THEN
    INSERT INTO mylog VALUES(user,sysdate,'D');
  ELSE
    INSERT INTO mylog VALUES(user,sysdate,'U');
  END IF;
END;

ps.能否記錄多個(gè)表?"after insert or delete or update on t1,t2" 出錯(cuò)。



三、替換觸發(fā)器
解決Oracle視圖中多表更新的限制,只能在視圖中使用,屬于行級(jí)觸發(fā)器。

例如:在視圖中插入新的部門(mén)同時(shí)插入其所屬的新員工:
CREATE OF REPLACE TRIGGER tr_v_e_d
  /* 在視圖上創(chuàng)建替換觸發(fā)器 */
  INSTEAD OF INSERT ON v_emp_dept
  FOR EACH ROW
BEGIN
  /* 替換觸發(fā)器先插入部門(mén)表的信息,然后再插入其所屬員工表的信息 */
  INSERT INTO deptment VALUES(:new.id, :new.name);
  INSERT INTO emp(eid, ename, sex, id) VALUES(:new.eid, :new.ename, :new.sex, :new.d);
END;

INSERT INTO v_emp_dept VALUES('456', 'test', 'f', '33', 'hg');
SELECT * FROM v_emp_dept;



四、模式級(jí)觸發(fā)器
可以在模式對(duì)象的操作上建立的觸發(fā)器,如 CREATE、ALTER、DROP、GRANT、REVOKE 和 TRUNCATE 等DDL語(yǔ)句。
[BEFORE | AFTER] trigger_event ON [schema.]SCHEMA

例如:對(duì)用戶所刪除的所有對(duì)象進(jìn)行日志記錄
CREATE OR REPLACE TRIGGER log_drop_obj
  AFTER DROP ON SCHEMA
BEGIN
  /* 記錄操作類型、操作對(duì)象、操作時(shí)間 */
  INSERT INTO dropped_obj VALUES(ORA_DICT_OBJ_NAME, ORA_DICT_TYPE, SYSDATE);
END;

CREATE TABLE for_drop(x char);
DROP TABLE for_drop;

SELECT * FROM dropped_obj;




五、數(shù)據(jù)庫(kù)級(jí)觸發(fā)器
可以創(chuàng)建在數(shù)據(jù)庫(kù)事件上的觸發(fā)器,包括啟動(dòng)、關(guān)閉、服務(wù)器錯(cuò)誤、登錄和注銷等。這些事件都是實(shí)例范圍內(nèi)的,不與特定的表或視圖關(guān)聯(lián)。

CREATE OR REPLACE TRIGGER system_startup
  AFTER STARTUP ON DATABASE
BEGIN
  ...
END;

網(wǎng)頁(yè)題目:Oracle筆記(九)、觸發(fā)器
分享地址:http://muchs.cn/article30/isggpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站建設(shè)微信小程序、靜態(tài)網(wǎng)站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)