gpt4 book ai didi

sql-server - SQL Server - 插入触发器后 - 更新同一表中的另一列

转载 作者:行者123 更新时间:2023-12-02 07:53:27 25 4
gpt4 key购买 nike

我有这个数据库触发器:

CREATE TRIGGER setDescToUpper
ON part_numbers
AFTER INSERT,UPDATE
AS
DECLARE @PnumPkid int, @PDesc nvarchar(128)

SET @PnumPkid = (SELECT pnum_pkid FROM inserted)
SET @PDesc = (SELECT UPPER(part_description) FROM inserted)

UPDATE part_numbers set part_description_upper = @PDesc WHERE pnum_pkid=@PnumPkid

GO

这是一个坏主意吗?那就是更新同一个表上的列。我希望它在插入和更新时都触发。

它有效,我只是害怕周期性情况。触发器内的更新会一次又一次地触发触发器。 会发生吗?

请不要对大写字母吹毛求疵。疯狂的情况。

最佳答案

这取决于数据库上当前设置的触发器的递归级别。

如果你这样做:

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

或者这个:

ALTER DATABASE db_name
SET RECURSIVE_TRIGGERS OFF

上面的触发器不会再次被调用,你会很安全(除非你陷入某种死锁;这是可能的,但也许我错了)。

不过,我认为这是一个好主意。更好的选择是使用 INSTEAD OF trigger 。这样您就可以避免在数据库上执行第一次(手动)更新。只有触发器内定义的才会被执行。

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
GO

这会自动用此语句“替换”原始 INSERT 语句,并对 part_description 字段应用显式 UPPER 调用。

INSTEAD OF UPDATE 触发器是类似的(我不建议您创建单个触发器,请将它们分开)。

此外,这还解决了@Martin 评论:它适用于多行插入/更新(您的示例不适用于)。

关于sql-server - SQL Server - 插入触发器后 - 更新同一表中的另一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5341584/

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