数据库之触发器

来源:互联网 发布:mysql eq ref 编辑:程序博客网 时间:2024/04/27 21:16

1.触发器:一个在修改指定表中的数据时执行的存储过程。用于实现不同表中的逻辑相关数据的引用完整性或一致性。


2.触发器优点:
自动执行,表的数据修改后立即激活
通过数据库中的相关表进行层叠更改

可以强制限制,引用其他表中的列,其限制比用CHECK约束更复杂。


3.触发器种类:

3.1 DDL(数据定义语言)触发器:

防止数据库架构进行某些更改;

数据库中发生某种情况以相应数据库架构中的更改;

记录数据架构中的更改或者事件可以使用DDL触发器;

3.2 DML(数据操作语言)触发器:INSERT\UPDATE\DELETE触发器

4.触发器的创建:

4.1 创建INSERT触发器:
create trigger T_addnum
on 学生信息
for insert
as
update 班级信息 set 班级人数=班级人数+1
where 班级编号=(select 所属班级 from inserted)

执行触发器,在学生信息表中插入一条记录:
SELECT 班级人数 from 班级信息 where 班级编号='20050101'
insert into 学生信息 value('2009010101','王俊','男','1986-08-09','汉族','20050101','北京')
SELECT 班级人数 from 班级信息 where 班级编号='20050101'
执行结果:班级人数+1。

4.2 创建DELETE触发器:(数据表中进行数据删除时,触发DELETE触发器)
CREATE TRIGGER T_DELETETEACHER
ON 教师信息
FOR DELETE
AS
  SELECT 姓名 AS 被删除的教师姓名,性别,年龄,联系电话 FROM DELETED(临时表)
执行触发器,删除一个教师信息
DELETE FROM 教师信息 where 教师编号='2005001'
SELECT * FROM 教师信息

4.3 创建UPDATE触发器:更改教师姓名,提示更改操作错误,不提交姓名更改,如果是年龄或籍贯,显示更改成功。
CREATE TRIGGER t_UPDATE
ON 教师信息
for update
as
 if (update(姓名) or update(性别))
begin
print '事物不能被处理,基础数据不能被修改!'
        ROLLBACK  TRANSACTION'事物关键字
end
else
print '数据修改成功!'

修改信息:
UPDATE 教师信息 set 姓名='李芳' where 教师编号='20050010'
SELECT * from 教师信息
执行结果:事物不能被处理,基础数据不能修改!

UPDATE 教师信息 set 联系电话='13598854445' where 教师编号='20050010'
SELECT * from 教师信息
执行结果:数据修改成功!

4.4 创建DDL触发器:
create trigger T_notdelete
on database          '对当前数据库创建触发器
for Drop_table,alter_table
AS 
    PRINT '事物不能被处理,基础数据表不能被修改或删除!'
   ROLLBACK         '取消所有数据输入

创建DDL触发器后,针对当前数据库,就可以在数据库触发器里面可以找到命为T_notdelete的触发器

删除一个数据表:

drop table student
结果:事物不能被处理,基础数据表不能被修改或删除!

5.管理触发器:
找到触发器-右击-修改、禁用、启用
禁用触发器代码:
alter table 员工信息

disable trigger t_add


启用触发器代码:
alter table 员工信息

enable trigger t_add


删除触发器代码:
drop trigger t_add

6.嵌套触发器:最多可以嵌套32层
针对两个表,新员工信息(试用期员工)、员工信息,定义两个触发器:

create trigger t_del
on 新员工信息
for delete
as 
  insert into 员工信息(员工编号,员工姓名,所在部门编号,所任职位,性别)
  select 员工编号,员工姓名,所在部门编号,所任职位,性别
  from deleted

create trigger t_add
  on 员工信息表
  for insert
  as
          update 部门信息 set 员工人数=员工人数+1

    where 部门编号=(select 所在部门编号 from inserted)


例如:
delete from 新员工信息 where 员工编号=14
select 员工人数 from 部门信息 where 部门编号='10001'    
结果:“行受影响”出现3行,表明该触发器对三个表进行操作。
再执行,员工人数结果为6。
分析:试用期员工转正首先要对新员工信息表进行删除操作,触发DELETE触发器,然后将该新员工的信息加入到员工信息表征,即对员工信息表进行INSERT操作,触发insert触发器,最后对部门信息表形成触发器嵌套,修改部门人数,员工人数。

7.递归触发器:任何触发器都可以包含影响同一个表或另一个表的UPDATE、INSERT、或DELETE语句。如果启用递归触发器选项,那么改变表中数据的触发器,通过递归执行就可以再次触发自己。


在数据库创建时,默认其情况下递归触发亲选项是禁用的,但是可以使用ALTER DATABASE语句来启用它,也可以在操作环境中启用递归触发器:数据库属性-选项-杂项-递归触发器已启用变为True递归触发器最多可达16层。







原创粉丝点击