我有一个表de有3列id(主键int),A(int)和B(int)。
我的要求是在A上有更新时更新B.
所以我使用了触发器,我尝试了如下
create trigger deTrigger on [dbo].[de]
for update
As
declare @aValue int;
select @aValue=i.A from inserted i;
update de set B =@aValue
GO
但我不知道如何在上面的更新查询中使用where
条件,所以当我在单个记录中更新A时,B col的所有行都会更新。
如果有其他方式使用触发器,那么请建议
答案 0 :(得分:2)
你需要这样的东西:
CREATE TRIGGER deTrigger
ON [dbo].[de]
FOR UPDATE
AS
UPDATE de
SET B = i.A
FROM Inserted i
INNER JOIN Deleted d ON i.ID = d.ID
WHERE i.ID = de.ID
AND i.A <> d.A
GO
基本上,您需要加入到Inserted
伪表(因为它可能包含多行),您还需要加入{ {1}}伪表。比较Deleted
和Inserted
的值,您可以获得对列Deleted
进行更新的行,并且可以在这些行中设置A
的值B
表
答案 1 :(得分:1)
标准SQL Server触发器是&#34;之后&#34;触发。这对于在事实&#34;之后更新日志和其他类型的&#34;使用。但是你想要在它进入表之前修改传入的流。
为此你需要&#34;之前&#34;触发。
哪个SQL Server没有......
不过不用担心,SQL Server 确实有一个&#34;而不是&#34;触发。最初仅用于观看,它也方便地用于表格,可能因此MS开发人员不必在实施之前解决所有问题。触发器。
这是一个例子。计划表具有日期时间字段(SchedDate)和关联的整数字段(SchedHour),其仅包含datetime字段的小时。因此,每当更改SchedDate时,必须将小时写入SchedHour。
create trigger T_Schedule_bu ON Schedule
instead of update as begin
set NoCount On;
update s
set s.Field1 = i.Field1,
s.Field2 = i.Field2,
s.SchedDate = i.SchedDate,
s.SchedHour =
case when i.SchedDate <> s.SchedDate
then DatePart( hour, i.SchedDate )
else s.SchedHour
end
from Schedule s
join inserted i
on i.ID = s.ID
end;
其他字段无条件更改;仅当SchedDate也被更改时,SchedHour才会更改。实际上,在这个特定的例子中,执行该测试并不是必需的。它只是展示了如何做到这一点。
如果您不熟悉&#34;而不是&#34;触发器,只知道触发器本身必须最终执行DML到目标表,否则它不会发生。所以一种方式来呈现一个表&#34;只读#34;创造一个&#34;而不是&#34;没有任何作用的触发器。
答案 2 :(得分:0)
试试这段代码 -
create trigger deTrigger
on [dbo].[de]
for update
As
update de
set B = i.A
FROM INSERTED i
WHERE de.id in (SELECT i.ID
FROM inserted i)