首先发生的事情是:计算的持久字段或ON INSERT TRIGGER更新

时间:2012-10-24 08:02:25

标签: sql-server sql-server-2008

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

首先更新哪个,持久字段或触发器更新?

2 个答案:

答案 0 :(得分: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伪表中获得,这是你真正应该关心的。

答案 1 :(得分:1)

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

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