简介
- 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
- 触发器通常用于强制业务规则
- 触发器是一种高级约束,可以定义比
CHECK
约束更为复杂的约束 - 触发器定义在特定的表上,与表相关
- 自动触发执行,不能直接调用
- 是一个事务(可回滚)
触发器类型
- AFTER触发器,在执行了INSERT、UPDATE或DELETE语句操作之后执行AFTER触发器。
- INSTEAD OF触发器,在指定的操作(INSERT、UPDATE或DELETE语句)之前被执行,它的功能是不执行指定的操作,而是执行INSTEAD OF触发器中定义的操作。
- DELETE 触发器
- INSERT 触发器
- UPDATE 触发器
insertd表 和 deleted表
-
触发器触发时:系统自动在内存中创建
deleted
表或inserted
表,只读,不允许修改;触发器执行完成后,自动删除 -
inserted 表 ,临时保存了插入或更新后的记录行
-
deleted 表,临时保存了删除或更新前的记录行
创建触发器
- 语法格式:
CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
- 例如:
-- INSERT
CREATE TRIGGER trig_transInfo
ON transInfo
FOR INSERT
AS
DECLARE @type char(4),@outMoney MONEY
DECLARE @myCardID char(10),@balance MONEY
SELECT @type=transType,@outMoney=transMoney,
@myCardID=cardID FROM inserted
IF (@type='支取')
UPDATE bank SET currentMoney=currentMoney-@outMoney
WHERE cardID=@myCardID
ELSE
UPDATE bank SET currentMoney=currentMoney+@outMoney
WHERE cardID=@myCardID
…
GO
-- DELETE
CREATE TRIGGER trig_delete_transInfo
ON transInfo
FOR DELETE
AS
print '开始备份数据,请稍后......'
IF NOT EXISTS(SELECT * FROM sysobjects
WHERE name='backupTable')
SELECT * INTO backupTable FROM deleted
ELSE
INSERT INTO backupTable SELECT * FROM deleted
print '备份数据成功,备份表中的数据为:'
SELECT * FROM backupTable
GO
-- UPDATE
CREATE TRIGGER trig_update_bank
ON bank
FOR UPDATE
AS
DECLARE @beforeMoney MONEY,@afterMoney MONEY
SELECT @beforeMoney=currentMoney FROM deleted
SELECT @afterMoney=currentMoney FROM inserted
IF ABS(@afterMoney-@beforeMoney)>20000
BEGIN
print '交易金额:'+convert(varchar(8),
ABS(@afterMoney-@beforeMoney))
RAISERROR ('每笔交易不能超过2万元,交易失败',16,1)
ROLLBACK TRANSACTION
END
GO