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 に答える