gpt4 book ai didi

T SQL-触发器而不是更新语句中不包含更新列

转载 作者:行者123 更新时间:2023-12-01 06:18:40 25 4
gpt4 key购买 nike

我对我正在尝试做的事情有一个小问题。但我怀疑这是不可能的,只是想了解一些其他见解。

我有一个包含六列的表格。其中两个与表上的记录更新有关,'UpdateBy' 和 'UpdateDate'。当有人在表上应用更新时,更新日期设置为系统时间,无论是否有人尝试设置时间和日期(这里没问题)但是当涉及到“UpdatedBy”时,我有一个问题。我曾尝试在触发器中使用“已插入”表,但是在执行语句时。

update PoolGroups
set
PoolDescription = 'test 1 description'
where
PoolName = 'test 2'

不包含“UpdatedBy”列的任何条目,“Inserted.UpdatedBy”字段包含表中已有的内容,而不是使用“更新”语句传入的内容。但是 'Inserted.PoolDescription' 的文本不是原来的。这是触发器。

CREATE TRIGGER TR_PoolGroups_Update
ON PoolGroups
instead of UPDATE
AS
BEGIN
UPDATE PoolGroups
SET
PoolDescription = i.PoolDescription
,UpdatedBy = coalesce(i.updatedby , (select SUSER_NAME()))
,UpdatedDate = getdate()
FROM
PoolGroups pg
INNER JOIN Inserted i
ON i.PoolName = pg.PoolName
END
GO

数据已在表 PoolGroups 中。

PoolName        PoolDescription     UpdatedBy  UpdatedDate
test 2 test description test1 2013-06-22 14:39:55.930

Inserted 表中的数据在运行插入时触发。

PoolName        PoolDescription     UpdatedBy  UpdatedDate
test 2 test 1 description test1 2013-06-22 14:39:55.930

我希望在更新语句不包含“UpdatedBy”字段时捕捉到,然后用登录的用户名替换它。我的问题是我不知道如何检测该字段是否包含在针对该表运行的更新语句中,因为我希望插入的表在“UpdatedBy”字段中有一个空值更新中未指定。有没有其他方法可以查明它是否在更新中指定?

最佳答案

我想我已经找到了答案。通过使用“更新(列名)”函数,我可以确定我遇到问题的字段是否已在更新语句中更新。因此,只需将“合并”语句替换为案例语句即可解决我的问题。新的触发代码。

CREATE TRIGGER TR_PoolGroups_Update
ON PoolGroups
instead of UPDATE
AS
BEGIN
UPDATE PoolGroups
SET
PoolDescription = i.PoolDescription
,UpdatedBy = case when UPDATE(UpdatedBy)
then i.updatedby
else (select SUSER_NAME()) end
,UpdatedDate = getdate()
FROM
PoolGroups pg
INNER JOIN Inserted i
ON i.PoolName = pg.PoolName
END
go

现在,如果有人对表应用更新,他们不必指定“UpdatedBy”,因为默认情况下它现在将获取 SQL 用户名。

关于T SQL-触发器而不是更新语句中不包含更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17251723/

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