計算フィールドが永続化されたテーブルがあります。永続化されたフィールドを含むいくつかのフィールドに基づいていくつかのフィールドを更新するトリガーがあります。
最初に更新されるのは、永続化されたフィールドとトリガーされた更新のどちらですか?
計算フィールドが永続化されたテーブルがあります。永続化されたフィールドを含むいくつかのフィールドに基づいていくつかのフィールドを更新するトリガーがあります。
最初に更新されるのは、永続化されたフィールドとトリガーされた更新のどちらですか?
これをノックアップするのにおそらく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
疑似テーブルから利用できます。これは、本当に気にする必要があるすべてです。
永続化された計算値は、実際の挿入の前に計算されます。トリガーは挿入後に発生します。したがって、永続化された計算値は常にトリガーで使用できます。
永続化されていない計算値についても同じことが当てはまりますが、そのメカニズムは異なります。非永続化された計算値へのアクセスは、トリガー自体からのアクセスを含め、オンザフライで値を計算します。したがって、値はトリガーで使用できます。