sql触发器入门学习

先说一下sql中触发器的概念:触发器是一种特殊的存储过程,被定义为在对特定表或视图发出UPDATE 、 INSERT 、DELETE? 语句时自动执行

  • 和特定表或者视图关联 触发器定义在特定的表或视图上 称为触发器表或触发器视图
  • 自动调用。当试图在某个表插入、更新、删除数据 而在那个表上定义了针对所做动作的触发器 那么触发器会自动执行
  • 不能被直接调用 不像普通的存储过程 触发器不能被直接调用 也不传递或接受参数
  • 是一个事务的部分 触发器以及触发它的语句被视为单个事务 可以在触发器内的任何地方被回滚

附:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。例如,在关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或整个程序。

简单举个例子就是你要同时修改数据库中两个不同表的时候,如果它们不是一个事务的话,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,就只有第二个表回到未修改之前的状态,而第一个表已经被修改完毕。

而当你把它们设定为一个事务的时候,当第一个表修改完,可是第二表改修出现了异常而没能修改的情况下,第一个表和第二个表都要回到未修改的状态!这就是所谓的事务回滚。

有2种触发器

  1. AFTER触发器在执行INSERT、UPDATE、DELETE语句的操作之后执行
  2. INSTEAD OF 触发器代替INSERT、UPDATE、DELETE语句执行

INSERT 触发器的工作过程

  1. 在定义了INSERT触发器的表上执行INSERT语句
  2. INSERT语句插入的行被记录下来
  3. 触发器动作被执行

inserted

  1. 触发INSERT触发器时候,新行被同时增加到触发器表和inserted临时表中
  2. inserted表是保存了插入行的副本的逻辑表,它并不实际存在于数据库中
  3. inserted表允许用户引用insert语句所插入的数据 这样触发器可以根据具体数据决定是否执行以及如何执行特定语句

INSERT触发器使用实例:现在数据库中有2个表orders和orderdetail 要实现orders表中插入一条记录insert into(orderid,number) values(4,1004) 后 相应的在orderdetails表中系统自动插入一条记录(orderid,productid) values(4,104),其中orderid是刚刚插入orders表中的orderid值 先假设productid为一个 常量值104

实现此功能需要在orders表上加一个触发器,触发器代码为:

create trigger tr_insert_orders on? orders
for insert as
begin
declare @id int
select @id=orderid from inserted
insert orderdetails(orderid,productid) values(@id,104)
end

DELETE触发器使用实例:现在数据库中有2个表orders和orderdetails 要实现orderdetails 表中删除一条记录后 相应的在order表中系统自动删除一条与刚才orderdetails表中相同orderid的记录

实现此功能需要在orderdetails表上加一个触发器,触发器代码为:

CREATE TRIGGER tr_delete_orderdetails ON [dbo].[orderdetails]
FOR? DELETE
AS
BEGIN
DECLARE @ID INT
SELECT @ID=ORDERID FROM DELETED
DELETE FROM ORDERS WHERE ORDERID=@ID
END

UPDATE触发器使用实例:现在数据库中有2个表orders和orderdetails 要实现orders表中更新一条记录后? 意即orderid由原来的4更改为5 系统自动的将orderdetails表中的orderid也更新为5 其实数据库表中对更新的操作执行的流程是先delete然后在insert 所以在orders表中更新orderid的时候原来的orderid的值 存放在了deleted临时表中 更新后的orderid的值 存放在了inserted临时表中

实现此功能需要在orders表上加一个触发器,触发器代码为:

CREATE TRIGGER TR_UPDATE_ORDERS ON [dbo].[ORDERS]
FOR? UPDATE
AS
BEGIN
DECLARE @OLDID INT,@NEWID INT

SELECT @OLDID =ORDERID FROM DELETED

SELECT @NEWID =ORDERID FROM INSERTED
UPDATE ORDERDETAILS SET ORDERID=@NEWID WHERE ORDERID=@OLDID
END

orders表结构

orderdetails表结构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值