一、基礎(chǔ)內(nèi)容
(1) 觸發(fā)器是一種實(shí)施復(fù)雜數(shù)據(jù)網(wǎng)整形的特殊存儲(chǔ)過程,在對(duì)表或者視圖執(zhí)行INSERT,UPDATE或者DELETE語句時(shí)自動(dòng)執(zhí)行,以防止對(duì)數(shù)據(jù)進(jìn)行不正確,未授權(quán)或不一致的修改。它不可以像調(diào)用存儲(chǔ)過程一樣由用戶直接調(diào)用執(zhí)行。 創(chuàng)建觸發(fā)器可以在查詢分析器中用SQL語句完成,也可以用企業(yè)管理器完成。在企業(yè)管理器中書寫觸發(fā)器時(shí),通過右鍵單機(jī)創(chuàng)建觸發(fā)器的表,在彈出的快捷菜單中依次選擇“所有任務(wù)”->“管理觸發(fā)器”命令,就打開“觸發(fā)器屬性”對(duì)話框,然后在該對(duì)話框的“文本”框中輸入常見觸發(fā)器的SQL語句。
在數(shù)據(jù)庫eduTest中,創(chuàng)建觸發(fā)器的操作,然后在相關(guān)的表上執(zhí)行INSERT,UPDATE,或DELETE語句,觀察他們的執(zhí)行結(jié)果。通過經(jīng)過觸發(fā)器的操作應(yīng)該了解觸發(fā)器的執(zhí)行過程。如何建立,刪除觸發(fā)器。
(2)存儲(chǔ)過程用來對(duì)一些基本的表的操作進(jìn)行封裝,在需要進(jìn)行操作時(shí)進(jìn)行調(diào)用,大大減輕編程的冗余性,增加了程序編寫的條理性和易讀性,以及可重用性;
(3)存儲(chǔ)過程與觸發(fā)器結(jié)合編程實(shí)驗(yàn);
二、操作語句
觸發(fā)器和存儲(chǔ)過程結(jié)合使用:
(1)/測試用/
CREATE TABLE student_test(
id INT PRIMARY KEY AUTO_INCREMENT,
sno INT(8) ZEROFILL NOT NULL UNIQUE,
sname VARCHAR(20) NOT NULL,
sage INT CHECK(sage>=16 AND sage<=60),
ssex VARCHAR(5) CHECK(ssex IN('男','女')),
sdept VARCHAR(10) DEFAULT 'cs'
);
DROP TABLE student_test;
SELECT * FROM student_test;
INSERT INTO student_test(sno,sname,sage,ssex) VALUE(04151078,'黎濤',20,'男');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151079,'郗宇',21,'ccc','cs');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151080,'張晰',19,'女','is');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151081,'王偉',70,'男','is');
/創(chuàng)建日志表信息對(duì)表操作完成后觸發(fā)寫進(jìn)日志表/
CREATE TABLE text_log(
id INT PRIMARY KEY AUTO_INCREMENT,
opra_table VARCHAR(20) NOT NULL,
opra_type VARCHAR(20) NOT NULL,
opra_remark VARCHAR(20)
);
/創(chuàng)建student表插入的觸發(fā)器/
CREATE TRIGGER trigger_insert_student AFTER INSERT ON student FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');
/刪除觸發(fā)器pro_insert_student/
DROP TRIGGER trigger_insert_student;
/創(chuàng)建student表刪除的觸發(fā)器/
CREATE TRIGGER trigger_delete_student AFTER DELETE ON student FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','delete','刪除');
/刪除觸發(fā)器pro_insert_student/
DROP TRIGGER trigger_delete_student;
/定義會(huì)話變量/
SET @sno_start=04151087;
SET @sno_end=04151095;
/查看會(huì)話變量/
SELECT @sno_start;
SELECT @sno_end;
/創(chuàng)建批插入的存儲(chǔ)過程,觸發(fā)插入操作對(duì)應(yīng)的觸發(fā)器/
DELIMITER $
CREATE PROCEDURE insert_student(IN sno_start INT, IN sno_end INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET i=sno_start;
WHILE i<=sno_end DO
INSERT INTO student(sno,sname,sage,ssex,sdept)
VALUE(i,'安雨軒',18+i-sno_start,'女','net');
SET i=i+1;
END WHILE;
END
$
/調(diào)用存儲(chǔ)過程,觸發(fā)插入操作對(duì)應(yīng)的觸發(fā)器/
CALL insert_student(@sno_start,@sno_end);
/創(chuàng)建批刪除的存儲(chǔ)過程,觸發(fā)刪除操作對(duì)應(yīng)的觸發(fā)器/
DELIMITER $
CREATE PROCEDURE delete_student(IN sno_start INT, IN sno_end INT)
BEGIN
DECLARE i INT DEFAULT 0;
SET i=sno_start;
WHILE i<=sno_end DO
DELETE FROM student WHERE student.sno=i;
SET i=i+1;
END WHILE;
END
$
/調(diào)用存儲(chǔ)過程,觸發(fā)刪除操作對(duì)應(yīng)的觸發(fā)器/
CALL delete_student(@sno_start,@sno_end);
/創(chuàng)建一個(gè)觸發(fā)器,在對(duì)student_test表進(jìn)行insert delete update 時(shí)觸發(fā)日志信息更新,以及查詢student_test表/
CREATE TRIGGER trigger_update_stuTest_to_select AFTER UPDATE ON student_test FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student_test','update','修改');
/更新student_test表的信息,觸發(fā)student_test的更新觸發(fā)器/
UPDATE student_test SET student_test.ssex='男' WHERE student_test.sno=04151079;
/查詢student_test表/
SELECT * FROM student_test;
修改前:


修改后:


/查詢student表的數(shù)據(jù)添加情況/
SELECT * FROM student;
/查詢text_log表的數(shù)據(jù)更新情況/
SELECT * FROM text_log;

/查詢student表的數(shù)據(jù)添加情況/
SELECT * FROM student;

/查詢text_log表的數(shù)據(jù)更新情況/
SELECT * FROM text_log;

DROP PROCEDURE insert_student;
DROP TABLE text_log;
存儲(chǔ)過程:
(1)/查詢網(wǎng)絡(luò)工程系年齡不大于20的學(xué)生的信息/
/定義會(huì)話變量進(jìn)行值得傳遞/
SET @dept='net';
SET @age=21;
DELIMITER $
CREATE PROCEDURE select_sdept_sage(IN dept VARCHAR(10),IN age INT)
BEGIN
SELECT * FROM student WHERE student.sage<=age AND
student.sdept=dept;
END
$
CALL select_sdept_sage(@dept,@age);

觸發(fā)器:
(1)/創(chuàng)建student表插入的觸發(fā)器/
CREATE TRIGGER trigger_insert_student_test AFTER INSERT ON student_test FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','insert','插入');
/*刪除觸發(fā)器pro_insert_student_test */
DROP TRIGGER trigger_insert_student_test ;
插入數(shù)據(jù):
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151084,'張發(fā)',18,'女','is');
INSERT INTO student_test(sno,sname,sage,ssex,sdept) VALUE(04151085,'程里',19,'男','is');
插入前:
student_test:

text_log:

插入后:
student_test

text_log

(2)/創(chuàng)建student表刪除的觸發(fā)器/
CREATE TRIGGER trigger_delete_student_test AFTER DELETE ON student_test FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student','delete','刪除');
/*刪除觸發(fā)器pro_insert_student_test */
DROP TRIGGER trigger_delete_student_test ;
/刪除語句/
DELETE FROM student_test WHERE student_test.sno=04151079;
刪除前:
student_test:

text_log:

刪除后:
student_test:

text_log:

(3)/創(chuàng)建一個(gè)觸發(fā)器,在對(duì)student_test表進(jìn)行insert delete update 時(shí)觸 發(fā)日志信息更新,以及查詢student_test表/
CREATE TRIGGER trigger_update_stuTest_to_select AFTER UPDATE ON student_test FOR EACH ROW
INSERT INTO text_log(opra_table,opra_type,opra_remark) VALUE('student_test','update','修改');
/更新student_test表的信息,觸發(fā)student_test的更新觸發(fā)器/
UPDATE student_test SET student_test.ssex='女' WHERE student_test.sno=04151079;
更新前:
student_test:

text_log:

更新后:
student_test:

text_log:
