1

外部CRMによってデータベースが部分的に作成および編集されており、特定のテーブルにはトリガーの後に複数(最大で2つ)があります。これは、1つのトリガーがCRM(制御が制限されている)によって自動生成され、もう1つのトリガーにコードが含まれているためです。

CRMトリガーは、挿入されたデータ行の主キーを生成します。私のトリガーは、外部キーとして別のテーブルに書き込むために、その主キーにアクセスする必要があります。私が使う

Select @id=max(id) from mytable

Scope_Identityが何らかの形で目的の結果を生成しなかったためです。

これは、CRMにテーブルと独自のトリガーを再作成させるまで機能しました。私のトリガーによって選択されたそのテーブルの最大IDは、常にactual_id-1であるように見えました。

同じコードを使用してトリガーを変更すると、常にプロシージャが再び機能します。

私の質問は次のとおりです。SQLサーバー(SQL Server 2008を使用しています)は、作成時間によってトリガーの順序を設定しますか?

そして

sp_settriggerorder @triggername='mycustomtrigger', @order='Last', @stmttype='INSERT'

これを永続的に変更する予定ですか、それともCRMがトリガーを再作成するたびに、そのプロシージャを再度呼び出す必要がありますか?(ALTERではなくDROPとCREATEを使用)

それに対する答えが、同じ問題を見ている人の助けになることを願っています。

よろしく

4

1 に答える 1

2

文書化されていませんが、LAST設定が変更されない限り、設定はトリガー付きのままであると思います。(逆に、トリガーを変更すると、この設定が失われることが文書化されています)。ただし、機能しているようです。

create table T (ID int not null)
go
create trigger T_T1 on T
after insert
as
    RAISERROR('T1',10,1) WITH NOWAIT
go
create trigger T_T2 on T
after insert
as
    RAISERROR('T2',10,1) WITH NOWAIT
go
create trigger T_T3 on T
after insert
as
    RAISERROR('T3',10,1) WITH NOWAIT
go
insert into T(ID) values (1)
go
sp_settriggerorder 'T_T2','Last','INSERT'
go
insert into T(ID) values (2)
go
drop trigger T_T1
go
create trigger T_T1 on T
after insert
as
    RAISERROR('T1',10,1) WITH NOWAIT
go
insert into T(ID) values (3)

結果:

T1
T2
T3

(1 row(s) affected)
T1
T3
T2

(1 row(s) affected)
T3
T1
T2

(1 row(s) affected)

ただし、最初の質問については、次のとおりです。

SQL Server(SQL Server 2008を使用しています)は、作成時間によってトリガーの順序を設定しますか?

それもそうです、私はそれに頼りません。sp_settriggerorder注文が文書化されている唯一の場所です。

最後に、私のコメントで述べたように、私はあなたの現在のメソッドに依存しませんSelect @id=max(id) from mytable-それはいくつかの理由で壊れている可能性がありますが、最も重要なのは、トリガーがメソッドごとに1回起動され、複数の行に応答して起動される可能性があることです、したがって、代わりに疑似テーブルを使用するトリガーを作成する必要がありますinserted(0、1、または複数の行が含まれていることを期待してください)。

于 2012-09-07T08:36:28.217 に答える