0

挿入/更新のトリガーの代わりに使用する更新可能なビューがあります。そのトリガーは 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 トリガーでのデフォルト値の使用に似たようなことがあり、挿入された行を一時テーブルにコピーし、一時テーブルを変更して物理テーブルからデフォルトの制約を追加することで解決しました。これらの追加手順のパフォーマンスの問題を許容できるかどうかはわかりません。

4

1 に答える 1

1

十分に単純です。デフォルト値を使用するには、DEFAULT キーワードを使用するか、挿入に含めないようにする必要があります。NULL 値もカウントされます。この場合、トリガーの挿入で値を指定しています。その部分を変えるとしたら

When Not Matched By Target Then
Insert
(
    id,
    forename,
    surname

)
Values
(
    i.id,
    i.forename,
    i.surname

)

When Not Matched By Target Then
Insert
(
    id,
    forename,
    surname

)
Values
(
    i.id,
    i.forename,
    DEFAULT

)

姓のデフォルト値が表示され始めます。残念ながら、それはあなたがやろうとしていることにはあまり役に立ちません。私が考えることができる最善の解決策(そしてそれは素晴らしいことではありません)は、isnullsを使用してデフォルトをトリガーに入れることです。

When Not Matched By Target Then
Insert
(
    id,
    forename,
    surname

)
Values
(
    ISNULL(i.id,newid()),
    i.forename,
    ISNULL(i.surname,'xxyyzz')

)

メンテナンスの観点からはあまり良くないことはわかっていますが、うまくいくでしょう。DEFAULT キーワードについては、かなりの詳細を記載した記事を投稿しました。

于 2013-03-17T03:53:06.897 に答える