我有一张如下表格,其中包含经销商代码和状态。每天晚上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
答案 0 :(得分:1)
如果您的UPDATE
语句一次影响多行,您将触发一次触发,但Deleted
中有多行(旧值之前) UPDATE
)和Inserted
(UPDATE
之后的新值)伪表。因此,最简单的方法是比较这些伪表以确定哪些行已更改。
另外:我 强烈 建议 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语句。它永远不会检查您是否更新了相同的值。