数据库触发器的创建

2025-10-16 08:54:19

1、触发器作用:

a.触发器通常用于强制业务规则

b.触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束

c.可执行复杂的SQL语句(if/while/case) 可引用其它表中的列

d.触发器定义在特定的表上,与表相关 不能直接调用的存储过程

e.是一个事务(可回滚)

ps:它是一种特殊的存储过程,也具备事务的功能,它能在多表之间执行特殊的业务规则.

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

2、--创建触发器语法

create trigger trigger_name

on  {table_name|view_name}

{After|Instead of} {insert|update|delete}

as 相应T-SQL语句

数据库触发器的创建

3、--触发器 我们用银行转账作为例子

--创建一张银行表

create table bank

 (    

    cardId char(9) primary key,    

    customerName CHAR(10),  --顾客姓名  

    currentMoney MONEY  default(1) check(currentMoney>0)    --当前余额

)

go

create table transInfo

 (   

 cardId char(9) references bank(cardId) ,  

  transType varchar(10) not null,   

 transMoney MONEY not null

)

go

INSERT INTO bank(cardId,customerName,currentMoney)    VALUES('1001 0001','张三',1000)

INSERT INTO bank(cardId,customerName,currentMoney)    VALUES('1001 0002','李四',1)

go

4、create trigger trig_Trans

on transInfo

for insert

as

declare @money money

declare @cardId char(9)

select @cardId=cardId,@money=case transType when '支出' then -transMoney else transMoney end from inserted

update bank set currentMoney=currentMoney+@money where cardId=@cardId

if(@@error>0)

begin

raiserror('交易失败',5,1)

rollback

end

else

begin

print('交易成功')

--commit

end

go

数据库触发器的创建

5、执行触发器 ,在添加数据这个操作的时候

insert into transInfo values('1001 0001','支取',200)insert into transInfo values('1001 0002','存入',20000)insert into transInfo values('1001 0002','支取',20001)

数据库触发器的创建

6、create trigger trig_Bank

on bank

for update

as

declare @newMoney money

declare @oldMoney money

declare @money money

declare @cardId char(9)

select @cardId=cardId,@newMoney=currentMoney from inserted

select @oldMoney=currentMoney from deleted

set @money= abs(@newMoney-@oldMoney)

if(@money>20000)

begin

raiserror('每笔交易金额不能超过20000元,交易失败',6,1)

print('交易金额:'+convert(varchar(20),@money))

rollback

end

else

begin

print('交易成功!交易金额:'+convert(varchar(20),@money))

print('帐号:'+convert(varchar(20),@cardId)+'帐户余额:'+convert(varchar(20),@newMoney))

end

go

数据库触发器的创建

7、触发器--删除触发:

delete bank where cardId='1001 0003'

数据库触发器的创建

8、触发器触发时:

系统自动在内存中创建deleted表或inserted表

只读,不允许修改;触发器执行完成后,自动删除

数据库触发器的创建

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢