[英]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
deleted
和inserted
是偽表,其中包含UPDATE
語句影響的行(對應於它們在語句前后的狀態)
有一個名為UPDATE
的函數可以回答“在此UPDATE
語句期間此列是否進行更新?”的問題。 但它 a) 只有在inserted
和deleted
的整個行集的答案和 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.