赞
踩
提示:以下是本篇文章正文内容,下面案例可供参考
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
简单来说:好比游戏里的隐藏成就,当你达到或者完成了一定的条件,自动触发的东西。
可在写入数据表前,强制检验或转换数据。
触发器发生错误时,异动的结果会被撤销。
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
可依照特定的情况,替换异动的指令 (INSTEAD OF)。
根据触发条件增删改数据库中的数据,因此,它其中的一个功能就是可用来判断,输入内容是否合法。
01、 在说怎么用之前,先介绍下DML触发器的分类。
它包括了下面三个类型的触发器:
insert 触发器
delete 触发器
update 触发器
下方我列了一个表,能更直观的看出来
inserted 逻辑表 | deleted 逻辑表 | |
增加记录(insert) | 存放添加记录 | 无 |
删除记录(delete) | 无 | 存放被删除的记录 |
修改记录(update) | 存放更新后的记录 | 存放更新前的记录 |
02、触发器有两个特殊的表:插入表(inserted 表)和 删除表(delete 表)。
这两个表是逻辑表,也是虚表,不会存储在数据库中,而且这两张表都是只读的。
04、SqlService下触发器的格式
- create trigger 触发器名
- on 哪个表
- for 那种类型触发器(insert , delete , update )
-
- as
- sql语句
- go
小练习1:a表添加数据时,b表也添加对应的数据
前提代码:
- drop database test01; --删除数据库test01
- create database test01; --创建数据库test01
- use test01; --使用test01数据库
-
- --创建数据表a
- create table a(
- id int ,
- name nvarchar(20),
- age nvarchar(20)
- )
-
- --创建数据表b
- create table b(
- id int,
- name nvarchar(20),
- sj time --时间
- )
思路:从逻辑表(inserted)里读取到所需要的数据(id,name),再赋值到自定义的变量里,续而通过自定义的变量编写所需要的代码。
- --题目:a表添加数据时,b表也添加对应的数据
-
- --创建新增类型触发器
- create trigger insert_a
- on a
- for insert --insert型触发器
- as
- declare @id int --自定义变量 id
- ,@name nvarchar(20) --自定义变量 name
- select @id=id,@name=name from inserted; --在inserted表里读取 id 和 name
- set @id=@id; --赋值到变量里
- set @name=@name; --赋值到变量里
- insert into b values(@id,@name,getdate()); --编写新增b表数据的代码
添加型触发器创建后,进行测试:a表添加一条数据,b表触发触发器,自动生成对应的数据
insert into a values(1,'花木兰','女');
查看两个表,这时发现触发了触发器
添加型的触发器就是这么简单!
小练习02:删除a 表的数据时,b表对应的数据同时删除。
思路:读取到a表的id 和 name ,再通过读取到的id 和 name 删除 b表中对应的数据
- --a表删除数据时,b表也删除对应的数据
- create trigger delete_a --创建触发器
- on a --a表在进行操作时
- for delete --删除型触发器
- as
- declare @id int --自定义变量id
- ,@name nvarchar(20) --自定义变量name
- select @id=id,@name=name from deleted ;--获取 id 和 name 的值
- set @id=@id;
- set @name=@name;
- delete from b where id=@id and name=@name --通过id和name删除b表对应数据
- ;
创建完触发器之后查看触发之前,两个表的数据
操作:删除a表时,b表对应的数据也删除
delete from a where id=1 ;
这时候我们再次查看两个表的数据时,发现b表的数据也删除了,说明删除型触发器触发成功
接下来就到最难理解的修改类型触发器了
老规矩:理论讲的在多,也不如代码来得影响深刻
- create trigger update_a --创建触发器
- on a --在a表变化时
- for update --修改型触发器
- as
- declare @id int --自定义变量
- ,@name nvarchar(20) --自定义变量
-
- select @id=id from deleted; --读取id
- select @name=name from inserted;--读取新的name值
- set @id=@id; --赋值
- set @name=@name; --赋值
- update b set name=@name where id=@id ; --通过id 修改b表的name
修改类型的触发器编写完成了,在测试这个触发器之前,我们添加几条数据,用于触发。
- insert into a values(1,'花木兰','女');
- insert into a values(2,'李白','男');
好了,数据准备完毕后,就可以修改a表的数据,然后查看b表里对应的数据是否也是修改了,如果说也修改了,那么说明修改类型的触发器触发成功
下面是修改之前的数据:
把a表里id为1的name修改成其他数据
update a set name='虞姬' where id=1;
这时候我们发现b表的数据同时也修改了,这说明修改类型的触发器成功触发了。
触发器本身没有过错,但由于我们的滥用,势必影响数据库的结构,同时增加了维护的复杂程度。
这篇文章是我写给那些第一次接触触发器和还未理解出发的人的,写的很浅显,理论也很少,代码里的案例用的也是最为简单和直观的。
希望对给位初次接触触发器的有个整体的概念,触发器是什么,能干什么,怎么写。这些最基本的触发器操作理解并读懂后,才能在以后编写出更高级的代码。
好了,今天就写到这里吧,如果这篇文章对你有帮助的话可以点个赞啥的,如果有兴趣的话,可以关注我,后续不定时接着讲解数据库方面的知识。
拜拜了您咧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。