gpt4 book ai didi

sql-server - 在更新触发器的临时表中保存更新尝试

转载 作者:行者123 更新时间:2023-12-04 06:47:01 26 4
gpt4 key购买 nike

查询是——
任何用户都不能更改产品表的价格。消息应该显示给用户。此外,所有更改价格的尝试都应保存在临时表中。

如何在 Sql server 2005 中使用更新触发器解决这个问题?
我试过如下。它按预期工作,但也显示错误 -

事务在触发器中结束。该批次已中止。

ALTER TRIGGER tr_Products_U ON dbo.ProductDemo AFTER UPDATE
AS
DECLARE @Data VARCHAR(200),
@sProductName NVARCHAR(40),
@mOldPrice MONEY,
@mNewPrice MONEY,
@ProductId int

IF UPDATE(ListPrice)
BEGIN
SELECT
@ProductId = d.ProductID,
@sProductName = d.Name,
@mOldPrice = d.ListPrice,
@mNewPrice = i.ListPrice
FROM
inserted i INNER JOIN deleted d ON i.ProductID = d.ProductID

SET @Data = 'Tried to update the price of ' + @sProductName
+ ' [ProductID :' + CONVERT(VARCHAR(10), @ProductId) + '] '
+ ' from '
+ CONVERT(VARCHAR(10), @mOldPrice)
+ ' to ' + CONVERT(VARCHAR(10), @mNewPrice)

print 'Can''t Change Price'
ROLLBACK TRAN

INSERT INTO #UpdateLIstPrices
VALUES (@Data);
END
RETURN
GO

最佳答案

与其将其编写为尝试回滚错误更改的 AFTER 触发器,我会将其作为 INSTEAD OF 触发器来处理,该触发器将任何尝试的更新记录到价格,但允许更新到其他列。

    ALTER TRIGGER tr_Products_U ON dbo.ProductDemo INSTEAD OF UPDATE
AS
IF UPDATE(ListPrice)
BEGIN
PRINT 'Can''t Change Price'

INSERT INTO #UpdateLIstPrices
SELECT 'Tried to update the price of ' + d.Name
+ ' [ProductID :' + CONVERT(VARCHAR(10), d.ProductId) + '] '
+ ' from '
+ CONVERT(VARCHAR(10), d.ListPrice)
+ ' to ' + CONVERT(VARCHAR(10), i.ListPrice)
FROM inserted i
INNER JOIN deleted d
ON i.ProductID = d.ProductID
END
ELSE
BEGIN
UPDATE pd
SET Name = i.Name
/*, other columns as needed */
FROM inserted i
INNER JOIN dbo.ProductDemo pd
ON i.ProductID = pd.ProductID
END
RETURN
GO

关于sql-server - 在更新触发器的临时表中保存更新尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615951/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com