有条件更新的数据库触发器问题
Posted
技术标签:
【中文标题】有条件更新的数据库触发器问题【英文标题】:Database trigger problem with conditional update 【发布时间】:2020-09-23 10:22:58 【问题描述】:我想在将数据集插入表后更正一个值。我尝试使用数据库触发器来解决这个问题。但是,如果我在更新调用中添加条件,它就不再起作用了。
到目前为止,此代码正在运行:
CREATE TRIGGER dbo.trgValidateQuantityUnit
ON dbo.tblPart AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
UPDATE tblPart SET tblPart.description3='TEST'
FROM tblPart INNER JOIN inserted ON (tblPart.id = inserted.id);
END
GO
它不再更改数据。如果将更新查询更改为:
UPDATE tblPart SET tblPart.description3='TEST'
FROM tblPart INNER JOIN inserted ON (tblPart.id = inserted.id)
WHERE (tblPart.craftelectro<>0);
我也试过
UPDATE tblPart SET tblPart.description3='TEST'
FROM tblPart INNER JOIN inserted ON (tblPart.id = inserted.id)
AND (tblPart.craftelectro<>0);
有人可以指点我正确的方向吗?
编辑: 触发器的目的应该是使数量单位(在下面的示例数据中)具有相同的格式。例如不为空,大写。数量单位由 productgroup、craftelectro 等其他字段确定 ...
quantityunit |craftelectro|productgroup
__________________________________________________
??_??@M; | 1| 29
de_DE@M;en_EN@M;en_US@M;| 1| 29
??_??@m; | 1| 29
| 1| 29
【问题讨论】:
我相信你想要的是WHERE (inserted.craftelectro<>0)
no unfurtonately 仍然无法正常工作
也许您可以向我们展示一些示例数据和预期结果,以便我们对您想要达到的目标有一个清晰的了解。事实上,我们都在猜测
添加了一些示例数据,我希望它更清楚一点,我想要做什么。 description3 字段仅用于测试,因为它通常为空
这个触发器看起来不错。这张表还有其他触发器吗?
【参考方案1】:
你应该这样重写你的代码:
CREATE TRIGGER dbo.trgValidateQuantityUnit
ON dbo.tblPart
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE T
SET description3='TEST'
FROM tblPart AS T
INNER JOIN inserted AS i
ON T.id = i.id;
END
GO
【讨论】:
嗨,这段代码可以正常工作,但是如果我添加一个额外的条件,比如WHERE (i.craftelectro<>0);
,它就会停止工作
@Andreas 你确定craftelectro 包含一个非空值吗?
定义为craftelectro(bit, not NULL)以上是关于有条件更新的数据库触发器问题的主要内容,如果未能解决你的问题,请参考以下文章