数据库基础--触发器

触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
触发器通常用于强制业务规则
触发器是一种高级约束,可以定义比 CHECK 约束更为复杂的约束
  可执行复杂的 SQL 语句(if/while/case)
  可引用其它表中的列

触发器定义在特定的表上,与表相关
自动触发执行
不能直接调用
是一个事务(可回滚)

触发器的类型
1.AFTER 触发器
  在执行了 INSERT、UPDATE 或 DELETE 语句操作之后执行 AFTER 触发器。AFTER触发器只能在表上指定。
  DELETE 触发器
  INSERT 触发器
  UPDATE 触发器
2.INSTEAD OF 触发器
  在指定的操作(INSERT、UPDATE 或 DELETE 语句)之前被执行,它的功能是不执行指定的操作,而是执行 INSTEAD OF 触发器中定义的操作。可以在表和视图上定义
  INSTEAD OF 触发器。每张表或视图上只能为每个触发动作(INSERT, UPDATE, or DELETE)创建一个 INSTEAD OF 触发器。
  DELETE 触发器
  INSERT 触发器
  UPDATE 触发器

触发器触发时:
  系统自动在内存中创建 deleted 表或 inserted 表
  只读,不允许修改;触发器执行完成后,自动删除
inserted 表
  临时保存了插入或更新后的记录行
  可以从 inserted 表中检查插入的数据是否满足业务需求
    如果不满足,则向用户报告错误消息,并回滚插入操作deleted 表
  临时保存了删除或更新前的记录行
  可以从 deleted 表中检查被删除的数据是否满足业务需求
  如果不满足,则向用户报告错误消息,并回滚删除操作

inserted 和 deleted 表存放的信息

/****************触发器实例****************/
CREATE TABLE [dbo].[bank]
(
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [CardID] [char](10) NOT NULL,
  [transType] [char](4) NULL,
  [currentMoney] [money] NULL,
  [transMoney] [money] NULL
)
CREATE TABLE [dbo].[transInfo]
(
  [cardID] [char](10) NOT NULL,
  [transType] [char](4) NULL,
  [transMoney] [money] NULL
)
--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,
    transType=@type,transMoney=@outMoney WHERE cardID=@myCardID
ELSE
  UPDATE bank
  SET currentMoney=currentMoney+@outMoney,transType=@type,transMoney=@outMoney WHERE cardID=@myCardID
GO
INSERT INTO bank VALUES('123456','',1000,'')
INSERT INTO transInfo VALUES('123456','支取',200)
INSERT INTO transInfo VALUES('123456','存款',10000)
--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 '备份数据成功,备份表中的数据为:'
DELETE FROM transInfo
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 ('每笔交易不能超过万元,交易失败',16,1)
  ROLLBACK TRANSACTION
END
INSERT INTO transInfo VALUES('123456','支取',20001)

触发器小结
1.如果一个表的外键在 DELETE、UPDATE 操作上定义了级联,则不能在该表上定义INSTEAD OF DELETE、INSTEAD OF UPDATE 触发器
2.如果定义视图时使用了 WITH CHECK OPTION,则不允许在其上创建 INSTEAD OF 触发器
3.触发器是“后过滤器”,它在数据修改通过所有规则、默认值之后才执行
4.首先考虑使用约束维护数据库完整性,仅在必要时才使用触发器
5.触发器是在对表进行插入、更新或删除操作时自动执行的存储过程,触发器通常用于强制业务规则
6.触发器还是一个特殊的事务单元,当出现错误时,可以执行 ROLLBACK TRANSACTION回滚撤销操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到Oracle数据库触发器,以下是一些基础知识: 1. 触发器的定义:触发器是一种数据库对象,它与表相关联,并在表上的特定操作(如插入、更新或删除)发生自动触发。 2. 触发器的类型:Oracle数据库支持三种类型的触发器:BEFORE触发器、AFTER触发器和INSTEAD OF触发器。 - BEFORE触发器:在触发操作执行之前触发。 - AFTER触发器:在触发操作执行之后触发。 - INSTEAD OF触发器:用于替代DML语句(如INSERT、UPDATE或DELETE),在执行操作之前触发。 3. 触发器的事件:触发器可以与一种或多种事件相关联,包括INSERT(插入)、UPDATE(更新)和DELETE(删除)。 4. 触发器的创建语法:创建触发器,需要指定触发器的名称、关联的表、触发事件和触发机(BEFORE或AFTER),并定义触发执行的逻辑。 ```sql CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name [FOR EACH ROW] [WHEN (condition)] BEGIN -- 触发执行的逻辑 END; ``` 5. 触发器中的NEW和OLD:在触发器的逻辑中,可以使用NEW和OLD关键字来引用新旧值。NEW代表触发操作后的新值,而OLD代表触发操作前的旧值。 ```sql :NEW.column_name -- 新值 :OLD.column_name -- 旧值 ``` 6. 触发器的管理:可以使用ALTER TRIGGER语句来修改触发器定义,使用DROP TRIGGER语句来删除触发器。 以上是Oracle触发器的一些基础知识,希望对你有所帮助。如果你有任何其他问题,请随提问!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值