玖叶教程网

前端编程开发入门

了解SQL Server触发器(sql server的触发器)

大家好,我是RomMr,今天和大家分享一下sql server触发器的基础知识,希望能帮到大家!

1、概念:

触发器是一种特殊的储存过程,是提供给程序员或者数据分析人员的一种来实施对表的复杂的完整性约束的一种方法,它不能被显性的调用,而是由特殊的事件(insert、update、delete)来进行触发。

上面一系列的官方语言很枯燥乏味,不好理解,其实上面就是在说,触发器就是一种用来保证表完整性约束的不能进行手动调用的只有当对表进行(insert、update、delete)修改时才能运行的储存过程。触发器可以说是储存过程的一种,我相信这样大家就比较好理解了。

2、触发器语法

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
 FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
 AS 
 T-SQL语句
GO
--with encryption 表示加密触发器定义的sql文本
--delete,insert,update指定触发器的类型

2、instead of和after触发器

sql server 提供了两种出发器 instead of 触发器和after 触发器 ,两种触发器的主要差别为以下三方面;

a、触发时机不同:也就说他们再被特殊事件(insert、update、delete)触发是执行 T-SQL语句的时机是不同的,after触发器是在特殊事件执行之后执行T-SQL语句,而instead of 在被特殊事件触发时,是用T-SQL语句替换特殊事件来执行的,也就是说instead of触发器没有执行特殊事件,而after触发器是执行了特殊事件以后再执行T-SQL语句。

b、作用对象范围不同:instead of触发器可以用于表和视图,而after触发器只能用于表不能用于视图

c、同一个表上创建个数不同:每张表上可以创建多个after触发器,而只能创建一个instead of触发器

3、inserted表和deleted表

inserted表和deleted表是触发器的两个专用表,是有触发器自动在内存中创建,只读不可修改,触发器完成后自动删除。

其中,inserted表临时存放了插入(insert)或者更新(update)的记录行,可以用来检查插入的数据是不是满足业务要求,如果不满足可以进行回滚插入操作;而deleted表是用来保存删除或者更新数据的,也可进行检查数据是否满足业务要求并进行相应的操作回滚。

inserted表和deleted表对照:

结合inserted表和deleted表可以大致看出触发器的工作原理:

4、实例

准备测试数据:

--创建学生表
create table student(
 stu_id int identity(1,1) primary key,
 stu_name varchar(10),
 stu_gender char(2),
 stu_age int
)

创建insert触发器:

--创建insert触发器
create trigger trig_insert
on student
after insert
as
begin
 if object_id(N'student_sum',N'U') is null--判断student_sum表是否存在
 create table student_sum(stuCount int default(0));--创建存储学生人数的student_sum表
 declare @stuNumber int;
 select @stuNumber = count(*)from student;
 if not exists (select * from student_sum)--判断表中是否有记录
 insert into student_sum values(0);
 update student_sum set stuCount =@stuNumber; --把更新后总的学生数插入到student_sum表中
end

测试触发器:

--测试触发器trig_insert-->功能是向student插入数据的同时级联插入到student_sum表中,更新stuCount
--因为是后触发器,所以先插入数据后,才触发触发器trig_insert;
insert into student(stu_name,stu_gender,stu_age)values('张三','男',30);
select stuCount 学生总人数 from student_sum; 
insert into student(stu_name,stu_gender,stu_age)values('李四,'女',30); 
select stuCount 学生总人数 from student_sum;
insert into student(stu_name,stu_gender,stu_age)values('王五','男',40); 
select stuCount 学生总人数 from student_sum;

结果为:

由于篇幅限制,今天就分享到这里,后续还会更新 触发器的管理、优点、应用,希望大家能够支持!谢谢!

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言