触发器

来源:互联网 发布:网络信息安全班会记录 编辑:程序博客网 时间:2024/06/05 09:31

触发器 分为语句式触发 和行级触发 

* 一个表中 最多可以有12个触发器,同一类型,同一时间,同一事件  只能有一个

触发器 本身是个事务,在触发器中可以对要操作的数据进行检查,如不满足,可以回滚

触发器分为  after/for  和instead of

after/for  是执行代码后,执行触发器,需要在表中定义

instead of  是执行代码前 执行触发器 ,可以在表中定义 也可以在视图中定义

触发器有两个虚表 inserted 和deleted   是由系统建立的,不显示在数据库中 ,结构与原表一样,触发器完成后 会自动删除 ,只读的,不能修改

inserted 表: 插入或修改后的数据

deleted 表:更新前或删除的数据

以下是转载

实验八触发器编程

实验目的

理解触发器的工作原理,掌握如何使用inserted表和deleted表及如何创建:INSERT、UPDATE、DELETE触发器。

实验内容

建立银行业务数据库bankdb,其中,帐户信息表(bank)存放帐户的信息,交易信息表(transInfo)存放每次的交易信息。

1、当向交易信息表(transInfo)中插入一条交易信息时,自动更新对应帐户的余额。

2、当删除交易信息表时,要求自动备份被删除的数据到表backupTable中。

3、跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。

实验步骤

1.建立一个银行的数据库并建立一张信息表和交易信息表                   

create database bankdb

create table bank

(customer varchar(10),

 cardID varchar(10),

 currentMoney numeric(8,4),

 constraint bank_pk primary key (cardID),

)

create table transInfo

(tranDate datetime,

 cardID varchar(10),

 transType varchar(10),

 transMoney numeric(8,4),

 constraint trans_pk primary key(cardID,tranDate),

)

2.插入张三和李四的信息

insert into bank values('张三','10010001','1000.0000');

insert into bank values('李四','10010002','3000.0000');

3.对transInfo建立一个触发器实现自动更新对应帐户的余额

create trigger B_insert

on transInfo

for insert as

 declare @tranDate datetime

 declare @cardID varchar(10)

 declare @transType varchar(10)

 declare @transMoney numeric(12,4)

 select @tranDate=tranDate,@cardID=cardID,@transType=transType,@transMoney=transMoney

 from inserted

  if@transType='支出'

    update bank

       setcurrentMoney=currentMoney-@transMoney

       where cardID=@cardID

 else

    update bank

       setcurrentMoney=currentMoney+@transMoney

       where cardID=@cardID;

演示一下

插入之前select *from bank

insert into transInfovalues(getdate(),'10010002','存储',300)

insert into transInfovalues(getdate(),'10010001','支出',100)

4. 当删除交易信息表时,自动备份被删除的数据到表backupTable中

建立一个表backupTable

create table backuptable

(tranDate datetime,

 cardID varchar(10),

 transType varchar(10),

 transMoney numeric(12,4)

)

建立删除的触发器

create trigger A_delete

on transInfo

for delete

as

 begin

 insert into backuptable

 select * from deleted

 end;

演示一下select *transInfo

delete from transInfo

select * transInfo

空表说明transInfo表里没有信息了

select * from backuptable

被复制到backuptable

5.跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。

对transInfo建立一个插入触发器

create triggererror on transInfo

for  insert

as

  declare @transMoney numeric(12,4) 

  select @transMoney=transMoney

  from inserted

  if @transMoney>20000

  print 'error! you transMoney>20000'

  rollback

演示一下

insert intotransInfo values(getdate(),'10010001','支出',30000)

select * from bank

说明rollback起作用了里面的值并没有发生改变


0 0
原创粉丝点击