登录触发器将为响应 login 事件而激发存储过程。与 sql server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 print 语句的消息)会传送到 sql server 错误日志。如果身份验证失败,将不激发登录触发器。
触发器的工作原理
触发器触发时:
系统自动在内存中创建inserted表或deleted表;
只读,不允许修改,触发器执行完成后,自动删除。
inserted表:
临时保存了插入或更新后的记录行;
可以从inserted表中检查插入的数据是否满足业务需求;
如果不满足,则向用户发送报告错误消息,并回滚插入操作。
deleted表:
临时保存了删除或更新前的记录行;
可以从deleted表中检查被删除的数据是否满足业务需求;
如果不满足,则向用户报告错误消息,并回滚插入操作。
inserted表和deleted表对照:
创建触发器
创建触发器的语法:
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指定触发器的类型
触发器示例
创建学生表
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 --判断student_sum表是否存在 if object_id(n'student_sum',n'u') is null --创建存储学生人数的student_sum表 create table student_sum( stucount int default(0) ); 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;
--创建insert_forbidden,禁止用户向student_sum表中插入数据 create trigger insert_forbidden on student_sum after insert as begin raiserror('禁止直接向该表中插入记录,操作被禁止',1,1) --raiserror 是用于抛出一个错误 rollback transaction end --触发触发器insert_forbidden insert student_sum (stucount) values(5);
--创建delete触发器 create trigger trig_delete on student after delete as begin select stu_id as 已删除的学生编号, stu_name stu_gender, stu_age from deleted end; --执行一条delete语句触发trig_delete触发器 delete from student where stu_id=1;
--创建update触发器 create trigger trig_update on student after update as begin declare @stucount int; select @stucount=count(*) from student; update student_sum set stucount =@stucount; select stu_id as 更新前学生编号, stu_name as 更新前学生姓名 from deleted; select stu_id as 更新后学生编号, stu_name as 更新后学生姓名 from inserted; end --创建完成,执行一条update语句触发trig_update触发器 update student set stu_name='张飞' where stu_id=2;
--创建instead of触发器 create trigger trig_insteadof on student instead of insert as begin declare @stuage int; select @stuage=(select stu_age from inserted) if(@stuage >120) select '插入年龄错误' as '失败原因' end