[英]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.