概述
浅谈SqlService系列文章
文章目录
- 系列文章目录
- 一、触发器是什么?
- 二、触发器能干什么?
- 三、触发器怎么用?
- 四、为什么要慎用触发器?
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、触发器是什么?
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。
简单来说:好比游戏里的隐藏成就,当你达到或者完成了一定的条件,自动触发的东西。
作用:
-
可在写入数据表前,强制检验或转换数据。
-
触发器发生错误时,异动的结果会被撤销。
-
部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
-
可依照特定的情况,替换异动的指令 (INSTEAD OF)。
二、触发器能干什么?
根据触发条件增删改数据库中的数据,因此,它其中的一个功能就是可用来判断,输入内容是否合法。
三、触发器怎么用?
01、 在说怎么用之前,先介绍下DML触发器的分类。
它包括了下面三个类型的触发器:
insert 触发器
delete 触发器
update 触发器
下方我列了一个表,能更直观的看出来
inserted 逻辑表 | deleted 逻辑表 | |
增加记录(insert) | 存放添加记录 | 无 |
删除记录(delete) | 无 | 存放被删除的记录 |
修改记录(update) | 存放更新后的记录 | 存放更新前的记录 |
02、触发器有两个特殊的表:插入表(inserted 表)和 删除表(delete 表)。
这两个表是逻辑表,也是虚表,不会存储在数据库中,而且这两张表都是只读的。
03、当然了,如果上面所写的两个点 都不懂 的话,没关系,有个概念就行了,下面附上代码后你会更直观的理解
04、SqlService下触发器的格式
create trigger 触发器名
on 哪个表
for 那种类型触发器(insert , delete , update )
as
sql语句
go
05、老规矩,理论看的再多也不如实践影响深,小练习搞上。
小练习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表的数据同时也修改了,这说明修改类型的触发器成功触发了。
四、为什么要慎用触发器?
触发器本身没有过错,但由于我们的滥用,势必影响数据库的结构,同时增加了维护的复杂程度。
总结
这篇文章是我写给那些第一次接触触发器和还未理解出发的人的,写的很浅显,理论也很少,代码里的案例用的也是最为简单和直观的。
希望对给位初次接触触发器的有个整体的概念,触发器是什么,能干什么,怎么写。这些最基本的触发器操作理解并读懂后,才能在以后编写出更高级的代码。
好了,今天就写到这里吧,如果这篇文章对你有帮助的话可以点个赞啥的,如果有兴趣的话,可以关注我,后续不定时接着讲解数据库方面的知识。
拜拜了您咧。
最后
以上就是任性金针菇为你收集整理的浅谈——触发器浅谈SqlService系列文章一、触发器是什么?二、触发器能干什么?总结的全部内容,希望文章能够帮你解决浅谈——触发器浅谈SqlService系列文章一、触发器是什么?二、触发器能干什么?总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复