触发器的简单应用
1.触发器和存储过程的区别
触发器是一个特殊的存储过程。区别就是在于,存储过程需要去调用,而触发器无需调用,在执行某些操作的时候,会自动执行。一般当表或者视图执行 增,删,改操作的时候,就会自动执行触发器中的PL SQL 语句块。还有一个区别, 创建触发器是不带参数的, 而存储过程可带可不带参数。
2.数据库行级触发器的应用
创建一个学生表:
CREATE TABLE xue_sheng( id integer, xing_ming varchar(25),xing_bie number, fen_shu number, b_id integer);
INSERT INTO xue_sheng VALUES(1,‘ZhanSan‘,1,80,1);
INSERT INTO xue_sheng VALUES(2,‘LiSi‘,1,90,2);
INSERT INTO xue_sheng VALUES(3,‘ZhanHong‘,0,75,2);
INSERT INTO xue_sheng VALUES(4,‘ChenXiaoMing‘,1,85,1);
创建一个班级表:
CREATE TABLE ban_ji( id integer , ban_ji varchar(25));
INSERT INTO ban_ji VALUES(1,‘1-(1)‘);
INSERT INTO ban_ji VALUES(2,‘1-(2)‘);
2.1创建一个删除行级触发器
当删除班级表的一个id , 那么它会自动把学生表所属的班级的学生也会删除
SQL> CREATE OR REPLACE TRIGGER del_ban_id
2 AFTER DELETE ON ban_ji
3 FOR EACH ROW
4 BEGIN
5 DELETE FROM xue_sheng where b_id=:old.id;
6 END;
7 /
DELETE FROM ban_ji where id=2;
查看,检查触发器是否自动执行了
select * from ban_ji;
select * from xue_sheng;
执行删除操作的时候, 建立一个 old内存表, old表和ban_ji表 结构完全一样
所以上面的 old.id 可以理解成 ban_ji班级表的 id
2.2创建一个插入行级触发器
SQL> CREATE OR REPLACE TRIGGER insert_ban_ji
2 AFTER INSERT ON ban_ji
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO xue_sheng VALUES(‘5‘,‘test‘,0,83,:new.id);
6 END;
7 /
INSERT INTO ban_ji VALUES(3,‘1-(3)‘);
查看,检查触发器是否自动执行了
select * from ban_ji;
select * from xue_sheng;
当插入数据时候,先插入到 new 表,new表和班级表结构也是一样的。 然后在插入到 真正的表,
所以 new.id 和 ban_ji班级表id 对应的。
2.3级联更新 同时涉及到 old.id 和 new.id
例如:我要更新班级表的班级id, 当然学生表的班级id也要同时更新
SQL> CREATE OR REPLACE TRIGGER update_ban_ji
2 AFTER UPDATE ON ban_ji
3 FOR EACH ROW
4 BEGIN
5 UPDATE xue_sheng SET b_id=:new.id WHERE b_id=:old.id;
6 END;
7 /
先查看一下原来2个表的数据
select * from xue_sheng;
select * from ban_ji;
然后更新班级表的id
UPDATE ban_ji SET id=8 WHERE id=1;
最后查看一下效果
select * from ban_ji;
select * from xue_sheng;