1

我有一个包含持久计算字段的表。它有一个触发器,可以根据包括持久字段在内的许多字段更新某些字段。

哪个先更新,持久化字段还是触发更新?

4

2 回答 2

3

大概用了 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伪表中获得,这是您真正应该关心的。

于 2012-10-24T08:24:06.767 回答
1

持久化的计算值是在实际插入之前计算的。触发发生在插入之后。因此,持久化的计算值将始终在触发器中可用。

非持久化计算值也是如此,但机制不同:对非持久化计算值的任何访问都将即时计算该值,包括来自触发器本身的访问。因此,再次,该值将在触发器中可用。

于 2012-10-24T09:46:36.603 回答