主表 MetroIncept 是一个委托单表,主要字段有:
- RecordId,委托单记录号,对应从表的 InceptRecId 字段。
- InceptFareSum, 金额,从表的金额合计值。
- InceptDetailCount, 委托器具数,从表的器具明细记录数。
从表 MetroInceptDetail 是委托单中的委托器具的明细表,主要字段有:
- InceptRecId, 委托单号,对应主表MetroIncept.RecordId。
- FareSum,收费金额
触发器功能要求:
- 当从表(委托明细表)记录改变时(新增、修改、删除),主表(委托单)的记录数字段和金额合计字段进行自动更新。
触发器程序:
-- MetroInceptDetail 新增后触发
CREATE TRIGGER Incept_FareSum_insert ON MetroInceptDetail AFTER INSERT AS
BEGIN
DECLARE @FareSum_insert Money
DECLARE @Counter_insert int
DECLARE @InceptRecId int
SELECT @InceptRecId = MIN(InceptRecId) FROM Inserted
while @InceptRecId is not null
BEGIN
-- 取得新增记录中本委托书号的记录数和金额合计 --
SELECT
@Counter_insert = COUNT(RecordId) ,
@FareSum_insert = SUM(ISNULL(FareSum, 0))
FROM Inserted
WHERE InceptRecId = @InceptRecId
-- 更新委托书 --
update MetroIncept SET
InceptFareSum = InceptFareSum + @FareSum_insert,
InceptDetailCount = InceptDetailCount + @Counter_insert
WHERE MetroIncept.RecordId = @InceptRecId
-- 取得下一个新增委托记录的委托单号 --
SELECT @InceptRecId = MIN(InceptRecId) FROM Inserted
WHERE InceptRecId > @InceptRecId
END
END
go
-- MetroInceptDetail 删除后触发
CREATE TRIGGER Incept_FareSum_delete ON MetroInceptDetail AFTER DELETE AS
BEGIN
DECLARE @FareSum_delete Money
DECLARE @Counter_delete int
DECLARE @InceptRecId int
-- 取得最小的一个委托单
SELECT @InceptRecId = MIN(InceptRecId) FROM deleted
while @InceptRecId is not null
BEGIN
-- 取得删除记录中本委托书号的记录数和金额合计 --
SELECT
@Counter_delete = COUNT(RecordId) ,
@FareSum_delete = SUM(ISNULL(FareSum, 0))
FROM deleted
WHERE InceptRecId = @InceptRecId
-- 更新委托书 --
UPDATE MetroIncept SET
InceptFareSum = InceptFareSum - @FareSum_delete,
InceptDetailCount = InceptDetailCount - @Counter_delete
WHERE MetroIncept.RecordId = @InceptRecId
-- 取得下一个删除委托记录的委托单号 --
SELECT @InceptRecId = MIN(InceptRecId) FROM deleted
WHERE InceptRecId > @InceptRecId
END
END
go
-- MetroInceptDetail 更新后触发
CREATE TRIGGER Incept_FareSum_update ON MetroInceptDetail AFTER UPDATE AS
IF Update( FareSum )
BEGIN
DECLARE @FareSum_delete Money, @FareSum_insert Money
DECLARE @InceptRecId int
-- 取得最小的一个委托单
SELECT @InceptRecId = MIN(InceptRecId) FROM deleted
while @InceptRecId is not null
BEGIN
-- 取得删除记录中本委托书号的记录数和金额合计 --
SELECT @FareSum_delete = SUM(ISNULL(FareSum, 0)) FROM deleted
where InceptRecId = @InceptRecId
-- 取得新增记录中本委托书号的记录数和金额合计 --
SELECT @FareSum_insert = SUM(ISNULL(FareSum, 0)) FROM Inserted
where InceptRecId = @InceptRecId
-- 更新委托书 --
update MetroIncept set
InceptFareSum = InceptFareSum + @FareSum_insert - @FareSum_delete
WHERE MetroIncept.RecordId = @InceptRecId
-- 取得下一个删除委托记录的委托单号 --
SELECT @InceptRecId = MIN(InceptRecId) FROM deleted
where InceptRecId > @InceptRecId
END
END
go
分享到:
相关推荐
sql server 触发器 数据库 sql server 触发器 数据库
此文档中详细的记载了,sql server触发器中自动生成的临时表,希望可以帮到有需要的朋友们!
5﹕在Orders表建立一个插入触发器﹐保证向Orders表插入的货品名必须要在Goods表中一定存在。 create trigger orderinsert3 on orders after insert as if (select count(*) from goods,inserted where goods....
sqlserver 触发器 insert阿 一个关于触发器的小例子
在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?...
CREATE TRIGGER TT ON TSYS_BAMKZ FOR INSERT AS INSERT TSYS_MKZ SELECT B.MKZM,A.yhz,B.PARENT FROM (SELECT DISTINCT yhz FROM TSYS_MKZ) A,INSERTED B
在实际应用中,SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表,当触发器被执行时产生。这是两个逻辑表,存放在内存中,表的结构与被触发器作用的表的结构相同且由系统自动创建和撤销。 使用...
SQLServer触发器语法.pdf
一个SqlServer触发器的Delphi应用源代码..rar
sqlserver2005触发器sqlserver2005触发器sqlserver2005触发器
第05节:SQLServer触发器Demo源代码.rar
利用SQLServer触发器实现表跟踪.pdf
SQLServer触发器实现不同服务器数据同步.pdf
Sqlserver触发器例子,Sqlserver触发器例子,Sqlserver触发器例子,Sqlserver触发器例子
新增用户发送邮件和手机短信的SqlServer触发器
sql server 用语句停用全部触发器, 也可启用全部触发器
最近用到触发器,研究了一下,现给菜鸟的你分享下。。
关于SqlServer 触发器这一章的幻灯片
在很多应用程序开发中,需要记录某些数据表的历史记录或修改痕迹,以便日后出现数据错误时进行数据排查。这种业务需求,我们可以通过数据库的触发器来轻松实现历史记录功能。 本文以SQL Server 2005数据库中的触发器...
SQL server 触发器,在触发Merge过程中,逐行触发的解决办法 用group by 避免是一次触发中的多行更新或删除。