SQL Server触发器

--触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手动执行,而是同事件来触发。

--触发器分类:
--(1)DML(Data Manipulation Language)触发器。包括的操作有:insert,delete,update
--(2)DDL(Data Definition Language)触发器。包括的操作有:create,alter,drop
--(3)登录触发器。与SQL SERVER实例建立用户会话时将引发此事件。登录触发器在登录身份验证完成之后、用户会话实际建立之前激发。
--所以如果身份验证失败,将不会触发。


--触发器触发时,系统自动在内存中创建deleted表或inserted表。这2表只读。触发器执行完后自动删除。
--(1)inserted表:临时保存insert插入的记录行、update更新后的记录行。
--(2)deleted表:临时保存delete删除的记录行、update更新前的记录行。
--基本语法:
create trigger trigger_name
on table_name
for [delete|update|insert]
as
t-sql语句
go

--DML触发器按触发方式又分为:
--after 触发器(之后触发):其中 after 触发器要求只有执行 insert、update、delete 某一操作之后触发器才会被触发,且只能定义在表上。
--instead of 触发器 (之前触发):instead of 触发器并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。
--可以在表或视图上定义 instead of 触发器。

--实例演示表:
--1、卡表(包含卡ID、卡号、卡余额、卡创建时间)。
--2、消费信息表(包括id、消费流水号、消费类型(包括充值、消费)、消费金额、消费时间)
--create table CardInfo(
--    CardID int primary key identity(1,1) not null,
--    CardNO varchar(10) unique not null,
--    CardMoney decimal(19,4) not null,
--    CreateDatetime datetime default getdate()
--    UpdateDatetime datetime
--)

--create table CardXF(
--    XFID int primary key identity(1,1) not null,
--    XFSSN varchar(20) not null,
--    CardNO varchar(10) not null,
--    XFType smallint not null,--1:充值;2:消费
--    CastMoney decimal(19,4) not null,
--    XFDatetime datetime default getdate()
--)

--insert into dbo.CardInfo(CardNO,CardMoney,CreateDatetime)
--values('9902A00001',0,getdate()),('9902A00002',0,getdate()),('9902A00003',0,getdate()),('9902A00004',0,getdate())
 

DECLARE @RANDNUM VARCHAR(100)
SET @RANDNUM=REPLACE(CONVERT(VARCHAR(100), GETDATE(), 20),'-','');
SET @RANDNUM=REPLACE(@RANDNUM,' ','');
SET @RANDNUM=REPLACE(@RANDNUM,':','');
SET @RANDNUM=@RANDNUM+convert(varchar,cast(rand() * 10000 AS int))

insert into dbo.CardXF(XFSSN,CardNO,XFType,CastMoney,XFDatetime)
values(@RANDNUM,'9902A00002',2,2,getdate())


--delete触发器
--业务场景:删除卡表数据,级联删除消费记录表相关数据。
create trigger trigger_CardInfo_delete
on dbo.CardInfo
for delete
as
    declare @CardNO varchar(10);
    select @CardNO=CardNO from deleted
    if(@CardNO is not null)
    begin
        delete from dbo.CardXF where CardNO=@CardNO
    end
go

--delete from dbo.CardInfo where CardNO='9902A00001'
 

--update触发器
--业务场景:消费记录的消费时间是不允许修改的。所以如果有修改dbo.CardXF表XFDatetime字段数据,提示失败并回滚
create trigger trigger_CardXF_updateXFDatetime
on dbo.CardXF
for update
as
    if update(XFDatetime)
    begin
        print '操作失败,消费时间不允许修改。';
        raiserror('安全警告:交易日期不能修改,由系统自动产生',16,1)
        rollback transaction;
    end
go

--update dbo.CardXF set XFDatetime=getdate() where XFSSN='20200106184557393'

--启用/禁用触发器
--(1)禁用触发器
--disable trigger trigger_CardXF_updateXFDatetime on dbo.CardXF
--此时再执行update,是可以执行成功的。
--update dbo.CardXF set XFDatetime=getdate() where XFSSN='20200106184557393'
--(2)启用触发器
--enable trigger trigger_CardXF_updateXFDatetime on dbo.CardXF
--此时再执行update,是失败的。
--update dbo.CardXF set XFDatetime=getdate() where XFSSN='20200106184557393'

select * from dbo.CardInfo
select * from dbo.CardXF

--查询已存在的触发器
select * from sys.triggers
select * from sys.objects where type='TR'
select * from sysobjects where xtype='TR'

--查看触发器触发事件对象
select * from sys.trigger_events

--查看已存在的触发器及事件
select b.type,b.type_desc,a.* from sys.triggers a join sys.trigger_events b
on a.object_id=b.object_id
 

--参考:
--https://www.cnblogs.com/shouke/p/10158049.html
--https://www.cnblogs.com/liuqiyun/p/8603088.html
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值