我有一個表ORDER_TEST有列№,STATUS和DATE_STATUS。
№ 每行(主鍵)都是唯一的。
我想創建一個觸發器,該觸發器將在更新STATUS_TIME后設定(更新)STATUS。
我試著用
CREATE TRIGGER AFTER_UPDATE_STATUS
ON ORDER_TEST
AFTER UPDATE
AS
UPDATE ORDER_TEST
SET DATE_STATUS = {fn now()}
FROM ORDER_TEST
JOIN INSERTED ON ORDER_TEST.[№] = inserted.[№]
WHERE (SELECT STATUS FROM INSERTED) <> (SELECT STATUS FROM DELETED)
但 SQL Server 表示更改將影響幾行。
請幫忙。怎么了?
uj5u.com熱心網友回復:
您還需要將該Deleted表添加到 Join 并檢查值是否已更改。
像這樣的東西
USE [TEST_DATABASE];
GO
CREATE TRIGGER AFTER_UPDATE_STATUS
ON ORDER_TEST
AFTER UPDATE
AS
UPDATE YourTable
SET
UpdateTimeStamp = GETDATE()
FROM Inserted
INNER JOIN Deleted
ON Inserted.KeyColumn = Deleted.KeyColumn
INNER JOIN YourTable
ON YourTable.KeyColumn = Inserted.KeyColumn
WHERE Inserted.Status <> Deleted.Status
uj5u.com熱心網友回復:
這取決于當前在 DB 上設定的觸發器的遞回級別。
如果你這樣做:
SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
或這個:
ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF
上面的觸發器不會再次被呼叫,而且你會很安全(除非你陷入某種僵局;那是可能的,但也許我錯了)。
盡管如此,我認為這不是一個好主意。更好的選擇是使用INSTEAD OF 觸發器。這樣您就可以避免對資料庫執行第一次(手動)更新。只會執行觸發器內部定義的那個。
一個INSTEAD OF INSERT觸發器是這樣的:
CREATE TRIGGER setDescToUpper ON part_numbers
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO part_numbers (colA, colB, part_description)
SELECT
colA, colB,
UPPER (part_description)
FROM
INSERTED
END
這取決于當前在 DB 上設定的觸發器的遞回級別。
如果你這樣做:
SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
或這個:
ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF
上面的觸發器不會再次被呼叫,而且你會很安全(除非你陷入某種僵局;那是可能的,但也許我錯了)。
不過,我認為這不是一個好主意。更好的選擇是使用 INSTEAD OF 觸發器。這樣您就可以避免對資料庫執行第一次(手動)更新。只會執行觸發器內部定義的那個。
一個INSTEAD OF INSERT觸發器是這樣的:
CREATE TRIGGER setDescToUpper ON part_numbers
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO part_numbers (colA, colB, part_description) SELECT
colA, colB,
UPPER(part_description)
FROM
INSERTED
END
這將自動“替換”原來的 INSERT 陳述句,并將顯式 UPPER 呼叫應用于該part_description欄位。
一個INSTEAD OF UPDATE觸發器是相似的(我不建議你創建一個觸發器,讓他們分開)。
此外,這解決了@Martin 評論:它適用于多行插入/更新(您的示例沒有)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344770.html
標籤:sql sql-server
