為了確保版本控制,我在我的表上創建了一個 For Update 觸發器。我有兩張桌子。Account 表,第一步 其次,在觸發器中使用的 Account 歷史表有一個名為 Version 的列。如果我的任何列被修改,我在該列中寫入了 Version 1,并且來自 Account 表的舊記錄將插入到觸發器的 Account 歷史記錄中。另外,我寫了一個觸發新條件。較新的版本應該被磨碎。版本,如果我在我的主(帳戶)表上運行更新查詢以執行負面測驗,同時保留舊版本,我會收到觸發器定義的錯誤,但我的更新陳述句仍然更新帳戶表,即使它不應該。我需要在我的更新中添加事務(BEGIN TRY BEGIN CATCH TRAN)?,如果我的觸發器失敗,我的更新陳述句應該失敗
ALTER TRIGGER tr_AccountHistory
ON account
FOR UPDATE
AS
BEGIN
SELECT old.column
FROM deleted
SELECT new.Version
FROM inserted
SELECT old.Version FROM deleted
IF @Old_Version >= @New_Version
BEGIN
RAISERROR ('Improper version information provided',16,1);
END
ELSE
BEGIN
INSERT INTO AccountHistory
(
insert column
)
VALUES
(
old.column
);
END
END
UPDATE account
SET id= 123456,
Version = 1
WHERE id =1
uj5u.com熱心網友回復:
而不是使用RAISERROR,你應該使用THROW。這將尊重XACT_ABORT并自動回滾事務。
您的觸發器還有其他致命缺陷:
- 它預計會修改一行。它可能是多行或零行。
- 您沒有宣告任何變數,而是選擇回傳給客戶端。
- 無論哪種方式,您都應該通過主鍵加入
inserted和表。deleted
CREATE OR ALTER TRIGGER tr_AccountHistory
ON account
FOR UPDATE
AS
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM inserted) -- early bailout
RETURN;
IF EXISTS (SELECT 1
FROM inserted i
JOIN deleted d ON d.YourPrimaryKey = i.YourPrimaryKey
WHERE d.Version >= i.Version
)
THROW 50001, 'Improper version information provided', 1;
INSERT INTO AccountHistory
(
insert column
)
SELECT
columsHere
FROM deleted;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529793.html
上一篇:使用選擇將資料插入表中
