SQL Server:如何跟踪列中的更改值,并仅针对更改的值发送通知电子邮件

时间:2016-09-26 07:43:52

标签: sql sql-server tsql

我有一张如下表格,其中包含经销商代码和状态。每天晚上1点到6点之间,状态栏可能会针对每个经销商代码进行更改。例如,今天00141.00062的状态为operational,但如果商店已关闭,明天它将为deactivated

简单地说,我想通过存储过程跟踪更改,并向我发送通知电子邮件,只是为了更新值。

最后,根据我之前的经验,我不想创建一个触发因素,它会影响我的主应用程序。因此,如果您能解释如何通过存储过程来解释,我将会非常感激。

 DEALER_CODE    STATUS
 ----------------------------
 00141.00062    OPERASYONEL
 01033.00061    DEACTIVE
 00070.00002    DEACTIVE
 00524.00002    DEACTIVE
 00387.00020    DEACTIVE
 00543.00001    DEACTIVE
 00310.00061    DEACTIVE
 00247.00062    OPERATIONAL

2 个答案:

答案 0 :(得分:1)

如果您的UPDATE语句一次影响多行,您将触发一次触发,但Deleted中有多行(旧值之前) UPDATE)和InsertedUPDATE之后的新值)伪表。因此,最简单的方法是比较这些伪表以确定哪些行已更改。

另外:我 强烈 建议 NOT 直接从触发器发送电子邮件,因为触发器在上下文中执行导致它触发的UPDATE语句,因此发送电子邮件的任何延迟都会降低主应用程序的速度。

相反,只需在表中添加一行,然后定期(每晚一次,每4小时一次或任何适合您的需要)有一个单独的进程从该表中获取新行并将其放入电子邮件中

所以触发器看起来应该是这样的:

CREATE TRIGGER trgUpdateStatus
ON dbo.YourTableName
AFTER UPDATE
AS
BEGIN
   SET NOCOUNT ON;

   -- insert a row into a "changed" table that will then be 
   -- used to asynchronously send out e-mails
   INSERT INTO dbo.ChangedDealerStatuses (DealerCode, OldStatus, NewStatus)
       SELECT
           old.Dealer_Code, old.Status, new.Status
       FROM 
           Deleted old
       INNER JOIN
           Inserted new ON old.Dealer_Code = new.Dealer_Code
       WHERE
           old.Status <> new.Status

END

答案 1 :(得分:0)

您可以使用after update触发器来实现此目的。这是示例代码:

CREATE TRIGGER TRIGGERNAME -- NAME OF TRIGGER
ON TABLENAME -- NAME OF YOUR TABLE
AFTER UPDATE
AS
BEGIN
   SET NOCOUNT ON;

   IF UPDATE([STATUS])
   BEGIN
        PRINT 'STATUS COLUMN IS UPDATED'
        ---------------------TODO------------           
        -- INSERT INTO TABLE OR SEND EMAIL-------
   END
END

注意:请注意,如果对列状态进行更新操作,将执行update语句。它永远不会检查您是否更新了相同的值。