2016-02-22 166 views
0

我有一个现有的流量管理系统(不是我设计的),并且想要设置一个自动发送电子邮件以用于交付证明 - 我们有将电子签名等发送到我们的Web服务器并更新的应用程序在几张不同的表格中提供相关信息。插入后的SQL Server触发器

我想现在创建一个SP,向客户发送电子邮件以提供交付详情。 我在一张桌子上创建了一个触发器,其中给出了状态和签名详细信息,即名称和gps位置。

USE [Transport_Comp1] 
GO 
/****** Object: Trigger [dbo].[TRG_InsertPodEmail2] Script Date: 02/22/2016 23:18:56 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[TRG_InsertPodEmail2] 
    ON [dbo].[DscPalletDetails] 
    AFTER INSERT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    insert into dbo.Pod2Email ([dwDscPalletDetailsId] 
     ,[dwPalletIdFK] 
     ,[dwJobItemIdFK] 
     ,[dwLegIdFK] 
     ,[dwDscStatusIdFK] 
     ,[szDscStatusCode] 
     ,[szNotes] 
     ,[bIsCollection] 
     ,[dtUpdateDate] 
     ,[szScannedBarcode] 
     ,[dwSignatureIdFK] 
     ,[dwScanStatusIdFk] 
     ,[nScanRef] 
     ,[szPalletNum]) 
    SELECT [dwDscPalletDetailsId] 
     ,[dwPalletIdFK] 
     ,[dwJobItemIdFK] 
     ,[dwLegIdFK] 
     ,[dwDscStatusIdFK] 
     ,[szDscStatusCode] 
     ,[szNotes] 
     ,[bIsCollection] 
     ,[dtUpdateDate] 
     ,[szScannedBarcode] 
     ,[dwSignatureIdFK] 
     ,[dwScanStatusIdFk] 
     ,[nScanRef] 
     ,[szPalletNum] 
     FROM INSERTED 
    -- Insert statements for trigger here 

END 

我可以扩展PodEmail表来包含来自另一个表的数据,即账户信息吗?

我想创建一个表格,我可以使用它作为游标的基础来循环通过记录从帐户表发送电子邮件到电子邮件 - 这是要走的路还是我远离基地?

任何指针非常感谢

BR

保罗

+2

不知道你在问什么,但你可以加入插入到另一个表,以获得额外的领域,如果这是你想要的。你必须有一个共同的关键领域。 – HLGEM

+2

您正处在正确的轨道上 - 在触发器中进行最少的处理。稍后将复杂的处理留给单独的批处理作业,该批处理作业将通过“Pod2Email”表进行批处理。这是您应该在其中加入帐户信息的地方 - 在之后的批处理作业中。通过批处理作业,我的意思是例如一个存储过程,它处理表Pod2Email,很可能在游标中,这是从SQL代理作业调用的。简而言之,请将帐户信息加入您的后续批处理作业。除非该信息仅在触发时间可用,否则不要在触发器中进行。 –

回答

2

你的做法是合理的,但要保证触发简单而有效的,特别是:

  1. 您使用的set nocount on好作为一些应用程序来练习,取决于它们如何写入可能会被多次报告给他们的行数所混淆。根据rowcount的先前设置,触发插入将返回适当的行数或无行数。该设置在触发器终止时自动恢复为其先前的值(如通常存储过程一样)。
  2. 正如@HGLEM在上面的评论中指出的那样,您可以将其与其他表格一起插入以获得更多的insert into DML列。
  3. 将触发器保持为一系列多行DML语句。 从不在触发器中使用光标。
  4. 要小心加入繁忙的表格,这些繁忙的表格可能长时间处理长时间运行的锁定并与之一起工作。这可能会导致触发器性能不佳,甚至导致死锁,因为完成但未提交的插入可能会作为死锁受害者回滚。
  5. 我会考虑不直接在目标insert into表上运行游标,而是通过将“email”光标处理的行选择到临时表(甚至可能是表变量)并在该表上运行光标以便避免即使在目标insert into表上长时间运行锁定的可能性。

祝您的项目顺利。

+0

肯 - 非常感谢你的指点 - 给我一些思考的食物 - 我会坚持不懈 - 永远觉得你已经脱掉了比你可以咀嚼!! ?? – PaulyboyUK