`
forestkqq
  • 浏览: 210322 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

SqlServer 触发器在master/detail表中的一个应用

Go 
阅读更多

 

主表 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 

 

 

 

 

 

分享到:
评论

相关推荐

    SQLServer触发器实现不同服务器数据同步.pdf

    SQL Server 触发器实现不同...本文提供了一个使用 SQL Server 触发器实现不同服务器之间的数据同步的解决方案,涉及到了多个知识点,包括 SQL Server 触发器、分布式事务处理服务、链接服务器、存储过程和作业等。

    sqlserver 触发器学习(实现自动编号)

    在SQL Server中,触发器是一种特殊的存储过程,它在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行,以实现复杂的数据完整性规则或业务逻辑。本篇将深入探讨触发器的基本概念、类型、分类及如何实现...

    sql server触发器.rar

    - 在一个示例中,我们可以创建一个INSERT触发器,确保每当向员工表插入新记录时,都会自动计算员工的入职年份。 - 另一个例子是使用UPDATE触发器来实现参照完整性的级联更新,当父表的某个字段更改时,自动更新...

    SQLServer触发器语法.pdf

    SQL Server 触发器是数据库管理系统中的一种机制,用于在执行某些操作时自动执行特定的操作。触发器可以帮助维护数据的一致性和完整性,提高数据库的安全性和可靠性。本文将详细介绍 SQL Server 触发器的语法和使用...

    sqlserver 触发器 insert阿

    sqlserver 触发器 insert阿 一个关于触发器的小例子

    sqlserver 创建触发器 远程服务器相应执行SQL语句

    本文将详细介绍如何在SQL Server中创建触发器来实现当本地数据库发生数据插入时,在远程服务器上相应地执行SQL语句,实现数据同步。这通常用于需要跨数据库同步数据的应用场景。 #### 准备工作 在开始之前,确保...

    使用SQL Server触发器实现数据表的级联更新.pdf

    在实际应用中,SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表,当触发器被执行时产生。这是两个逻辑表,存放在内存中,表的结构与被触发器作用的表的结构相同且由系统自动创建和撤销。 使用...

    SQL SERVER触发器在学生管理系统中应用.pdf

    例如,在学生信息表中插入一个新同学的信息记录时,系统将数据插入到学生信息表的同时,也把相应的数据插入到 INSERTED 临时表中。当某个同学退学时,执行 DELETE 语句时,系统将数据从表中删除的同时,自动把删除的...

    sqlserver2005触发器

    sqlserver2005触发器sqlserver2005触发器sqlserver2005触发器

    新增用户就发送邮件和手机短信的SqlServer触发器

    根据给定的文件信息,我们可以深入探讨如何在SQL Server中创建一个触发器,该触发器在新用户添加到系统时自动发送电子邮件和短信通知。这一技术应用广泛于各种需要即时通知用户注册确认、账户激活或密码重置的场景中...

    SQLServer触发器.pdf

    SQL Server触发器是一种特殊的存储过程,它会在满足特定条件时自动执行。触发器的执行是由数据表中的数据变化所触发的,例如插入、更新或删除操作。在本文件中,创建了两个触发器:trig_transInfo和trig_delete_...

    关于SqlServer 触发器的PPT

    SQL Server的触发器是一种特殊的存储过程,它在特定的数据操作事件(INSERT、UPDATE或DELETE)发生时自动执行,用于扩展数据库系统的功能,实现更复杂的业务逻辑。触发器可以帮助确保数据完整性,实现级联操作,或者...

    SQL Server 利用触发器对多表视图进行更新的实现方法

    在SQL Server中,触发器是一种特殊的存储过程,它在数据更改操作(如INSERT、UPDATE或DELETE)发生时自动执行。...这在数据库设计中是一个实用的技巧,特别是在大型企业级应用中,能够提高数据管理的效率和准确性。

    基于sql server 2005的触发器的创建及操作

    在SQL Server 2005中,触发器是一种特殊的存储过程,它在特定的数据操作语言(DML)事件,如INSERT、UPDATE或DELETE发生时自动执行。触发器可以帮助实现复杂的业务规则和数据完整性,通过扩展SQL语句的功能,提供了...

    SQL Server触发器在教务管理系统中的应用探索.pdf

    本文将深入探讨SQL Server触发器在教务管理系统中的应用,以及如何利用其特性来实现高效的数据管理和业务逻辑。 首先,触发器可以确保数据的完整性。在教务管理系统中,可能需要维护一些复杂的业务规则,例如学生的...

    sql server 2005第十二课(sql server触发器)

    在这个例子中,当向Employees表中插入新记录且EmployeeID为空时,触发器会为新员工分配一个唯一的ID。 三、修改触发器 修改触发器通常涉及到使用ALTER TRIGGER语句。你可以添加、删除或修改触发器内部的SQL语句。...

    SQL Server常用操作触发器、存储过程.rar

    在SQL Server中,触发器和存储过程是两个重要的数据库编程元素,它们对于数据管理和业务逻辑的实现至关重要。本文将深入探讨这两个概念以及如何在实际操作中使用它们。 首先,我们来了解一下触发器(Triggers)。...

    数据库——存储,触发器.sql_sqlserver触发器在哪

    /*------存储1 根据用户输入该学生编号,检查是否存在,若存在则显示出*/ Create procedure p1 @sno char(10) ,@sname char(10),@ssex char(2),@borndate datetime,@classname varchar(50) As Begin ...

    SQL Server触发器在数据库综合性实验中的应用.pdf

    在数据库综合性实验中,SQL Server触发器的应用是一个重要的研究课题,它在确保数据完整性方面发挥着至关重要的作用。触发器是一类特殊的存储过程,它们是为响应特定的数据库事件而自动执行的。在“学生成绩管理系统...

Global site tag (gtag.js) - Google Analytics