sqlserver触发器Tigger使用及示例
阅读原文时间:2021年04月20日阅读:1

一:触发器的优点
1.触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
2.触发器可以通过数据库中的相关表进行层叠修改。
3.触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。
二:触发器的作用
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的一致性,它能够对数据库中的相关表进行级联修改,提高比CHECK约束更复杂的的数据完整性,并自定义错误消息。触发器的主要作用主要有以下接个方面:
1. 强制数据库间的引用完整性
2. 级联修改数据库中所有相关的表,自动触发其它与之相关的操作
3. 跟踪变化,撤销或回滚违法操作,防止非法修改数据
4. 返回自定义的错误消息,约束无法返回信息,而触发器可以
5. 触发器可以调用更多的存储过程

三:触发器的分类
SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
1.DML(数据操作语言,Data Manipulation Language)触发器
DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:
1. insert触发器:向表中插入数据时被触发;
2. delete触发器:从表中删除数据时被触发;
3. update触发器:修改表中数据时被触发。
当遇到下列情形时,应考虑使用DML触发器:
1. 通过数据库中的相关表实现级联更改
2. 防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。
3. 评估数据修改前后表的状态,并根据该差异才去措施。
2.DDL(数据定义语言,Data Definition Language)触发器
DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。
3.登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

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

create trigger insert_forbidden
on student_sum
after insert
as
begin
    RAISERROR('禁止直接向该表中插入记录,操作被禁止',1,1)--raiserror 是用于抛出一个错误
rollback transaction
end 

create trigger trig_delete
on student 
after delete
as
begin
    select stu_id as 已删除的学生编号,stu_name stu_gender,stu_age
    from deleted
end;

触发器种类


下面介绍一个较为奇葩的出发器运用示例:
需要如下图,需求要求以XS为首字母,时间日期YYYYMMDD为中间序号,结尾xxx为流水号,原程序中的流水号是按照前面的综合去判定的,也就是XS20190223相同时,同一天建立两张单据则设置后面流水为001和002,现要求流水号已年的形式排序,则之前的控件无法达到效果,下面用触发器尝试后发现可以

ALTER trigger [dbo].[cghtspbh]
on [dbo].[采购合同审批表]
after insert
as
begin
    declare @number char(3);
    declare @String char(17);
    declare @String2 char(20);
   select @number=(
    select case when count(*)<10 then '00'+convert(varchar(30),count(*)) 
when count(*)>10 and count(*)<100 then '0'+convert(varchar(30),count(*)) 
when count(*)>100 then convert(varchar(30),count(*)) 
end as 数量 from 采购合同审批表
where substring(合同编号,3,4)=YEAR(getdate()));
select @String=substring(合同编号,0,11) from inserted;
select @String2=合同编号 from inserted;
    update 采购合同审批表 set 合同编号 = rtrim(ltrim(rtrim(ltrim(@String))+rtrim(ltrim(@number)))) where 合同编号=@String2
end

通过拆分原程序自动生成的流水号(不考虑后3位的形式)在通过查询当前表格中以2019年份开头的数据(与当前时间对比获取年份)的个数,凭借生成流水号,在自动接上之前生成的固定格式+时间作为新的完整流水号

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章