簡體   English   中英

檢查字段值是否在 sql server 觸發器上更新

[英]Check if field value updated on sql server trigger

如何檢查此觸發器中更新的字段值:

ALTER TRIGGER dbo.OrderApprovedSms 
   ON  dbo.[Order]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    /*How can check approve date is updated*/
    IF (/*ApproveDate is updated*/)
    BEGIN
       INSERT INTO office.SmsSendBuffer
               ( Number ,
                 Body 
               )
       SELECT 'xxxxxx','ORDER APPROVED!'
    END

END

它會是這樣的:

ALTER TRIGGER dbo.OrderApprovedSms 
   ON  dbo.[Order]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    INSERT INTO office.SmsSendBuffer
         ( Number ,
             Body 
         )
    SELECT 'xxxxxx','ORDER APPROVED!' --No columns from inserted or deleted?
    FROM inserted i INNER JOIN deleted d
        ON i.<primary key column 1> = d.<primary key column 1> AND
           i.<primary key column 2> = d.<primary key column 2> AND
           i.ApprovedDate != d.ApprovedDate --Not sure what actual check you wanted to perform
END

deletedinserted是偽表,其中包含UPDATE語句影響的行(對應於它們在語句前后的狀態)

有一個名為UPDATE的函數可以回答“在此UPDATE語句期間此列是否進行更新?”的問題。 但它 a) 只有在inserteddeleted的整個行的答案和 b) 不允許您區分沒有實際影響的更新和那些有實際影響的更新(例如,如果您執行SET Column=2 ,其中Column已經是2 ,它仍然回答Column已更新)


作為我認為UPDATE函數毫無意義的一個例子,請考慮以下內容:

create table T (ID int not null,Col1 int not null)
go
create trigger TT on T after update
as
    IF UPDATE(Col1)
    BEGIN
        RAISERROR('Hello',10,1) WITH NOWAIT
    END
go
update T set Col1 = Col1

在輸出中打印Hello - 因此,我們有一個影響0行的UPDATE (因為表是新的),即使有任何行,也不會更改任何數據。

使用inserted表,它將包含新行。 deleted將包含舊行。

你可以做這樣的事情......

INSERT INTO TargetTable(Col1, COl2, Col3)
SELECT t.Col1, t.COl2, t.Col3
FROM TableName t
WHERE EXISTS
         (
          SELECT 1
          FROM inserted i INNER JOIN deleted d 
          ON i.PK_Col = d.PK_Col
          WHERE i.Date_Col <> d.Date_Col
          AND d.PK_Col = t.PK_Col
          )

注意:- 將此作為單獨的評論發布,因為我沒有足夠的積分來添加評論。

為此,您有兩個選項, UPDATE() 和 COLUMNS_UPDATED() 。 發布使用 UPDATE() 函數的示例腳本,為 UPDATE() 和 COLUMNS_UPDATED() 提供外部鏈接。 請查看這些鏈接以獲取詳細說明。

use TempDb 
Go 
create table test ( n1 int , n2 int , n3 int ) 
go 
create table testCopy ( n1 int , n2 int , n3 int ) 
go 
create trigger TestTrg
on  test
after update 
as 
if update(n3)  -- This is the key function
               -- http://technet.microsoft.com/en-us/library/ms186329.aspx -- COLUMNS_UPDATED() 
               -- http://technet.microsoft.com/en-us/library/ms187326.aspx -- UPDATE() 
   insert into testCopy (n3 )  select n3 from deleted
go 
insert into test values ( 1, 2, 3 ) ,( 2, 3, 4) 
go 

update test set n2 = n2 + 1  -- no values would be inserted into testcopy
update test set n1 = n1 + 1  -- no values would be inserted into testcopy

update test set n3 = n3 +1 where n3 = 3  -- one row will be inserted into test copt

這很簡單,您可以使用 UPDATE 函數來檢查字段值更新。

ALTER TRIGGER dbo.OrderApprovedSms 
   ON  dbo.[Order]
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    /*How can check approve date is updated*/
    IF (UPDATE (ApproveDate))
    BEGIN
       INSERT INTO office.SmsSendBuffer
               ( Number ,
                 Body 
               )
       SELECT 'xxxxxx','ORDER APPROVED!'
    END

END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM