筆記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>