2016-09-26 48 views
0

我有一张表,其中包含经销商代码和状态。每天晚上1点到6点,状态栏可能会更改为每个经销商代码。例如,今天00141.00062的状态是operational,但是如果商店关闭,明天它将是deactivatedSQL Server:如何跟踪列中的更改值并只发送更改值的通知电子邮件

简而言之,我想通过存储过程来跟踪更改,并发送通知电子邮件给我,只是为了更新值。

最后,我不喜欢根据我以前的经验创建触发器原因,它会影响我的主应用程序。因此,如果你能解释我如何通过存储过程来做到这一点,我会感到欣慰。

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

您正在使用哪个数据库管理系统? (SQL本身没有电子邮件功能。) – jarlh

+0

它可能与在sql中创建配置文件 – Bharat

+0

标准版..其实我可以处理emai问题,我写了一个代码..只是我需要知道什么是跟踪的最佳方式这些变化 –

回答

1

如果您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 
+0

实际上很难插入行,因为通过不同的web服务创建的表。因此,在这个触发器之后,我需要创建一个新的查询,然后发送给更改过的经销商代码。如果您可以分享查询,我会很高兴,我将如何做到这一点? –

+0

是否有可能通过存储过程做到这一点?因为我想我需要定期获取此表的副本,并将其称为旧表,然后在1天后创建一个sp,它将在早上工作以检查更改的值。它的工作原理是什么? –

+0

@SemihUral:当然,您可以编写一个存储过程,**(1)**检查中间表是否有新条目,**(2)**根据需要发送电子邮件,然后您可以安排此存储过程根据需要运行 - 每小时一次,每天一次 - 在您的情况下有意义 –

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 

注意:请注意,如果更新语句将在列状态更新操作时执行。它从不检查您是否更新了相同的值。

相关问题