我有一个包含持久计算字段的表。它有一个触发器,可以根据包括持久字段在内的许多字段更新某些字段。
哪个先更新,持久化字段还是触发更新?
大概用了 5 分钟才搞定这个。它回答了你的问题吗?
create table T (
ID int not null,
Val1 varchar(10) not null,
Val2 as SUBSTRING(Val1,1,5) persisted
)
go
create table T2 (
Action char(1) not null,
Val1 varchar(10) not null,
Val2 varchar(5) not null
)
go
create trigger T_T_I
on T
instead of insert
as
insert into T (ID,Val1) select ID,Val1 from inserted
insert into T2 (Action,Val1,Val2) select 'I',Val1,Val2 from inserted
go
create trigger T_T_A
on T
after insert
as
insert into T2 (Action,Val1,Val2) select 'A',Val1,Val2 from inserted
go
insert into T(ID,Val1) values (1,'abcdefghi')
go
select * from T2
结果:
Action Val1 Val2
------ ---------- -----
A abcdefghi abcde
I abcdefghi abcde
也就是说,计算列始终可以从inserted
伪表中获得,这是您真正应该关心的。
持久化的计算值是在实际插入之前计算的。触发发生在插入之后。因此,持久化的计算值将始终在触发器中可用。
非持久化计算值也是如此,但机制不同:对非持久化计算值的任何访问都将即时计算该值,包括来自触发器本身的访问。因此,再次,该值将在触发器中可用。