Sql-Server

如果現有值高於插入值,則觸發以防止更新

  • October 29, 2020

如果現有值高於插入的值,我需要一個觸發器來防止更新價格。如果出現這樣的操作事務,觸發器應該阻止值更新但讓事務結束(即不回滾)。下面的一個不起作用 - 即使插入的值高於現有值,它也不會讓更新發生。

CREATE TRIGGER [dbo].[Prices_InsteadUpdate_Trigger]
ON [dbo].[Prices]
INSTEAD OF UPDATE
AS

SET NOCOUNT ON

IF UPDATE(PRC_Value) AND EXISTS (SELECT *
                                FROM deleted d
                                JOIN inserted i
                                    ON d.PRC_PrcId = i.PRC_PrcId
                                 WHERE d.PRC_Value > i.PRC_Value)
SELECT NULL

SET NOCOUNT OFF

問候, 普熱梅克

您正在使用INSTEAD OF UPDATE,這意味著每次更新都將在觸發器中結束。

ELSE如果第一個 IF 不為真,您可以添加一條語句進行更新。

CREATE TRIGGER [dbo].[Prices_InsteadUpdate_Trigger]
ON [dbo].[Prices]
INSTEAD OF UPDATE
AS

SET NOCOUNT ON

IF UPDATE(PRC_Value) AND EXISTS (SELECT * FROM deleted d JOIN inserted i ON d.PRC_PrcId=i.PRC_PrcId WHERE d.PRC_Value>i.PRC_Value)
SELECT NULL
ELSE 
UPDATE P
SET PRC_Value = i.PRC_Value
FROM dbo.Prices P
INNER JOIN inserted i
ON i.PRC_PrcId = P.PRC_PrcId;

SET NOCOUNT OFF;

測試

CREATE TABLE dbo.Prices(PRC_PrcId INT IDENTITY(1,1) PRIMARY KEY NOT NULL,
                       PRC_Value numeric(5,2));


INSERT INTO dbo.Prices(PRC_Value)
VALUES(1.2)

GO

更低的價格

UPDATE dbo.Prices
SET PRC_Value = 0.5;

結果

(No column name)
NULL

更高的價格

UPDATE dbo.Prices
SET PRC_Value = 1.5;

結果

PRC_PrcId   PRC_Value
1   1.50

引用自:https://dba.stackexchange.com/questions/249803