挿入/更新のトリガーの代わりに使用する更新可能なビューがあります。そのトリガーは Merge を使用します。Merge ステートメントが基礎となる物理テーブルからデフォルトの制約を適用していないことがわかりましたが、マージのドキュメントではそうすべきであることが示唆されています。
次の例は、次のことを示しています。
create table tblTest
(
id uniqueidentifier not null primary key default newid(),
forename varchar(20),
surname varchar(20) not null default 'xxyyzz'
)
go
create view vwTest as select * from tblTest
go
create Trigger vwTest_trigger_insteadof_insert_update On vwTest
Instead of Insert, Update As
begin
set nocount on
Merge tblTest t
Using
inserted i On (t.id = i.id)
When Matched Then
Update
Set
t.forename = i.forename,
t.surname = i.surname
When Not Matched By Target Then
Insert
(
id,
forename,
surname
)
Values
(
i.id,
i.forename,
i.surname
)
OUTPUT $action, Inserted.*, Deleted.*
;
end
go
--Inserts to physical table work as expected
insert into tblTest (id) values (newid())
insert into tblTest (surname) values ('smith')
--Inserts into updateable view fail as no defaults are set
--from the underlying physical table
insert into vwTest (id) values (newid())
insert into vwTest (surname) values ('jones')
INSTEAD OF INSERT トリガーでのデフォルト値の使用に似たようなことがあり、挿入された行を一時テーブルにコピーし、一時テーブルを変更して物理テーブルからデフォルトの制約を追加することで解決しました。これらの追加手順のパフォーマンスの問題を許容できるかどうかはわかりません。