繁体   English   中英

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

[英]SQL Server : How to track changes value in a column and send notification email for only changed values

我有一个下表,其中包含经销商代码和状态。 每晚凌晨1点至6点之间,状态栏可能会针对每个经销商代码而更改。 例如,今天的状态00141.00062 operational状态,但是明天将deactivated商店,将其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

如果您的UPDATE语句一次影响多行,则将触发一次触发器,但在Deleted (在UPDATE之前的旧值)和Inserted (在UPDATE之后的新值)伪表中包含多行。 因此,最简单的是比较那些伪表以找出哪些行已更改。

另外:我强烈建议不要直接从触发器发送电子邮件,因为触发器在导致触发的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

为此,您可以使用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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM