筆記081122 --- trigger

 

筆記081122 --- trigger

2008-11-21 下午6:32 發佈人 tiger chang

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
觸發器

觸發器的設計 是自動執行的,觸發器是不接受參數的
可以用來維護表的約束限制,審批表的相關信息,
數據操作員觸發器,
數據定義元觸發器。

~~~~~~~~~~~~~~~~~~~~~~~~~~~
行級觸發器的工作原理
~~~~~~~~~~~~~~~~~~~~~~~~~~~
事務簡述
    事務是數據庫中的重要機制,用於確保數據完整性和併發處理

的能力
它將一條、一組SQL語句當作成一個邏輯上的單元,用於保證這些語句都

能成功或失敗。
事務的特性
    A(AOMICITY):原子性
    C(CONSISTENCY):一致性
    I(ISOLATION):隔離性
    D(DURABILITY):永久性
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
刪除數據的行級觸發器

CREATE OR REPLEACE TRIGGER del_s
AFTER DELETE ON STUDENT
FOR EACH ROW
BEGIN
DELETE FROM SC WHERE SNO  = :OLD.SNO;
END del_s;
/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

CREATE OR REPLACE TRIGGER INSERT_S
AFTER INSERT ON STUDENT
FOR EACH ROW
BEGIN
INSERT INTO SC(SNO,CNO) VALUES(NEW.SNO,'0001');
END;
/

OLD AND NEW
old 和 new 是內存中的特殊的表,
old  new 是在內存中的邏輯表

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

級聯更新
 
CREATE OR REPLACE TRIGGER UPDATE_S
AFTER UPDATE ON STUDENT
FOR EACH ROW
BEGIN
UPDATE SC SET SNO = :NEW.SNO WHERE SNO= :OLD.SNO;
END;
/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
觸發器中不能使用commit & rollback;

CREATE OR REPLACLE  TRIGGER DEL_STU
AFTER DELETE ON STUDENT
FOR EACH ROW
BEGIN
IF :OLD.SNO = '05062233' THEN
RAISE_APPLICATION_ERROR(-20000,'不允許刪除該數據'); 
ENDIF;
END;
/

-------------_______________
SQL> CREATE OR REPLACE  TRIGGER DEL_STU
  2  AFTER DELETE ON STUDENT
  3  FOR EACH ROW
  4  BEGIN
  5  IF :OLD.SNO = '06062233' THEN
  6  RAISE_APPLICATION_ERROR(-20000,'不允許刪除該數據');
  7  END IF;
  8  END;
  9  /

觸發器已創建

SQL> DELETE FROM STUDENT WHERE SNO = '06062233';
DELETE FROM STUDENT WHERE SNO = '06062233'
            *
第 1 行出現錯誤:
ORA-20000: 不允許刪除該數據
ORA-06512: 在 "CHANGHU.DEL_STU", line 3
ORA-04088: 觸發器 'CHANGHU.DEL_STU' 執行過程中出錯

_____________________________________________


RAISE_APPLICATION_ERROR(-20000,'不允許刪除該數據'); 
啓動錯誤
(-20999  -20000)這個錯誤號的使用範圍。
---- -20000是錯誤好,''爲錯誤信息


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

語句級的觸發器

~~~~~~~~~~~~~~~~~~~~~~~~~

CREATE TABLE MYLOG(
CURR_USER VARCHAR2(100),
CURR_DATE DATE,
ACT     CHAR(1)
);

CREATE OR REPLACE TRIGGER DML_AA
AFTER INSERT OR DELETE OR UPDATE ON STUDENT
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;
/

SQL> EDIT
已寫入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

觸發器已創建

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

CREATE OR REPLACE TRIGGER SET_AUTO
BEFORE INSERT ON AUTO
FOR EACH ROW
DECLARE
NO NUMBER(5),
BEGIN
SELECT MYSEQ.NEXTVAL INTO NO FROM DUAL;
:NEW.A:=NO;
END;
/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

替換觸發器的應用

只能建到試圖上

解決試圖的多表更新問題


CREATE OR REPLACE TRIGGER TR_V_E_D
INSERT OF INSERT ON view_sc
FOR EACH ROW
BEGIN
INSERT INTO .....
INSERT INTO ......
END;
/


~~~~~~~~~~~~~~~~~~~~~

-------- -----------------------------------------


SQL> L
  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSEIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> EDIT
已寫入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

觸發器已創建

SQL> DESC DEPT2;
 名稱                                      是否爲空
 ----------------------------------------- -------

 ID                                        NOT NUL
 NAME

SQL> INSER INTO  DEPT VALUES(4,'HELLOWORLD');
SP2-0734: 未知的命令開頭 "INSER INTO..." - 忽略了剩
SQL> INSERT INTO DEPT2 VALUES (4,'HELLOWORLD');

已創建 1 行。

SQL> INSERT INTO DEPT2 VALUES (4,'HELLOWORLD');
INSERT INTO DEPT2 VALUES (4,'HELLOWORLD')
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (CHANGHU.SYS_C004113)


SQL> INSERT INTO DEPT2 VALUES (5,'HELLOWORLD');

已創建 1 行。

SQL> INSERT INTO DEPT2 VALUES (6,'HELLOWORLD');

已創建 1 行。

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 5

已更新 1 行。

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 3

已更新 1 行。

SQL> DELETE  FROM DEPT2 WHERE ID = 5;

已刪除 1 行。

SQL> DELETE  FROM DEPT2 WHERE ID = 4;

已刪除 1 行。

SQL> SELECT * FROM MYLOG;

未選定行

SQL> SELECT * FROM MYLOG;

未選定行

SQL> SELECT TARGGER_NAME FROM USER_TRIGGERS;
SELECT TARGGER_NAME FROM USER_TRIGGERS
       *
第 1 行出現錯誤:
ORA-00904: "TARGGER_NAME": 標識符無效


SQL> SELECT TRIGGER_NAME FROM USER_TRIGGERS;

TRIGGER_NAME
--------------------------------------------------
INSERT_S
UPDATE_S
DEL_DEPT2
DEL_S
DEL_STU
DEPT2
ABOUT_MYLOG

已選擇7行。

SQL> SELECT * FROM MYLOG;

未選定行

SQL> CREATE OR REPLACE TRIGGER DEPT2
  2  AFTER INSERT OR DELETE OR UPDATE ON MYLOG
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11  END;
 12  /

觸發器已創建

SQL> EDIT
已寫入 file afiedt.buf

  1  CREATE OR REPLACE TRIGGER MYLOG
  2  AFTER INSERT OR DELETE OR UPDATE ON DEPT2
  3  BEGIN
  4  IF INSERTING  THEN
  5  INSERT INTO MYLOG VALUES(USER,SYSDATE,'I');
  6  ELSIF DELETING THEN
  7  INSERT INTO MYLOG VALUES(USER,SYSDATE,'D');
  8  ELSE
  9  INSERT INTO MYLOG VALUES(USER,SYSDATE,'U');
 10  END IF;
 11* END;
SQL> /

觸發器已創建

SQL> INSERT INTO DEPT2 VALUES(19,'HELLO');

已創建 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I

SQL> UPDATE DEPT2 SET NAME = 'GOOGLE' WHERE ID = 19;

已更新 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I
CHANGHU                                  22-11月-08     U

SQL> DELETE FROM DEPT2 WHERE ID = 19;

已刪除 1 行。

SQL> SELECT * FROM MYLOG;

CURR_USER                                CURR_DATE      AC
---------------------------------------- -------------- --
CHANGHU                                  22-11月-08     I
CHANGHU                                  22-11月-08     U
CHANGHU                                  22-11月-08     D

SQL>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章