插入后的Sql Server触发器

时间:2016-02-22 23:26:46

标签: sql sql-server sql-server-2008 email

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

我想现在创建一个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

1 个答案:

答案 0 :(得分:2)

如果您保持触发器简单有效,您的方法是合理的,特别是:

  1. 使用set nocount on是一种很好的做法,因为某些应用程序(根据它们的编写方式)可能会被报告给它们的多行计数混淆。触发插入将根据rowcount的先前设置返回正确的行计数或无行计数。当触发器终止时,此设置会自动恢复为先前的值(通常与存储过程一样)。
  2. 正如@HGLEM在上面的评论中指出的那样,您可以与其他表一起插入以获取更多insert into DML列。
  3. 将触发器保留为一系列多行DML语句。 从不在触发器中使用光标。
  4. 小心加入可能具有长时间运行锁定的长事务的忙表,以便与它们一起使用。这可能导致触发器性能不佳甚至导致死锁,并且可能会将已完成但未提交的插件作为死锁受害者回滚。
  5. 我会考虑不直接在目标insert into表上运行游标,而是选择要通过“email”游标处理到临时表(甚至可能是表变量)并将光标放在其上的行。表,以避免在目标insert into表上长时间运行锁定的可能性。
  6. 祝你的项目好运。