触发器
来源:互联网 发布:网络信息安全班会记录 编辑:程序博客网 时间: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起作用了里面的值并没有发生改变
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- 触发器
- oracle静态监听和动态监听
- 斐波那契数列及相关问题
- easyui设置combobox高度
- 新路程----海思 uboot(1)
- openwrt+Linkit7688+wm8960:粗略实现wm8960耳麦和喇叭音频输出
- 触发器
- 网络架构重组--目前三大运营商存在的“僵硬”问题解决方法
- 数据库事务的ACID
- python并发的痛——多线程
- LIBSVM与LIBLINEAR(一)
- jquery合并表头单元格
- USACO | Greedy Gift Givers
- Ubuntu下交换Esc和Caps Lock按键
- 线性图形混合