触发器:定义是说某个条件成立的时候,你触发器里面所定义的语句就会被自动的执行,因此触发器不需要人为的去调用,也不能调用。
然后,触发器的触发条件其实在你定义的时候就已经设定好了的,触发器可以分为语句级触发器和行级触发器,简单地说就是语句级的触发器,可以在某些语句执行前或执行后被触发,而行级触发器则是在定义的触发的表中的行数据改变时就会被触发一次。
示例:
1:在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程,这个就是删除表的操作就是触发器的执行的条件
2:在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器就会被自动执行了。
触发器主要由以下几个部分组成
1:触发事件
2:触发条件
3:触发对象
4:触发操作
编写触发器时,需要注意以下几点
触发器不接收参数,一个表上最多可以有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个,还需要注意,各个触发器之间不能有矛盾。
在一个表上的触发器越多,对在该表上的DML操作性能影响也就越大。触发器最大为32KB,如果确实需要,可以先建立过程,然后在触发器中用CALL语句调用。
在DML触发器中只能使用DML语句(select,insert,update,delete)
在系统触发器中只能包含DDL语句(create,alter,drop)
触发器中不能包含事务控制语句(commit,rollback,savepoint)。因为触发器是触发语句中的一部分,触发语句被提交或回退,触发器也就被提交或回退。
在触发器主体中调用的任何过程,函数不能使用事务控制语句。
示例:
1:学生表里有这个学生的学号,姓名,另一张学生的选课表,如果用户修改了学生表中的学生姓名,那么学生选课表中的学生姓名也要修改过来..如果在数据库中建立一个这修改的触发器,那么 这个不再手动修改,否则选课表中的姓名要手工修改..
2:比如你有两个表 A 和 B,A表有ID 和 NAME两列,B表有ID,PLAY,NAMEID三列,A与B没有关联。如果你想删除B表的内容,但是又同时想删除A表中A.ID=B.NAMEID,那么你就要写两条语句。
如果使用触发器,就只用写删除B表的内容语句,一旦删除内容,则触发器设定的表规则被触发,那么A表的相关内容也一起删除了。
触发器应用
1:如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关,也就是同时更改借书记录表的学号
对于1,需要用到触发器。
create Trigger truStudent
on Student 在Student表中创建触发器
for update 因为什么事件触发
as
if Update(StudentId)
begin
update BorrowRecord
set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表
Where br.StudentID=d.StudentID
end
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。
对于2
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制