5

私は非常に奇妙な行動に気づきました。挿入選択ステートメントを作成し、選択部分がデータを返さない場合でも、挿入部分は実行され、挿入トリガーも呼び出されます(挿入トリガーでは、挿入された疑似テーブルに0行があります)。

例:

insert into table1 column1
select column1 from table2 where condition = 'Never met'

出力:

(0 row(s) affected) // 0 rows inserted
(1 row(s) affected) // log from trigger

「ユニバーサル」トリガー(FOR INSERT、UPDATE、DELETEを一度に宣言)が原因でしょうか?これは架空の質問に似ていることを知っており、この動作を受け入れる必要があります。しかし、なぜこれが起こっているのですか?私には意味がありません。SQL Server 2005 を使用しています。

-- kwitee

4

2 に答える 2

9

彼らはそうするように文書化されているからですか?

DML トリガーは、ユーザーがデータ操作言語 (DML) イベントを通じてデータを変更しようとすると実行されます。DML イベントは、テーブルまたはビューに対する INSERT、UPDATE、または DELETE ステートメントです。これらのトリガーは、表の行が影響を受けるかどうかに関係なく、有効なイベントが発生したときに発生します。

(私の強調)

あまり意味がないかもしれませんが、Microsoft が、影響を受ける行がないことが判明したときにトリガーを抑制する特別なコード パスを作成するには、より多くの時間と開発努力が必要になるでしょう。

これは、0、1、または多数の行を処理しinserted、潜在的に含むトリガーを慎重に設計する必要がある別の例です。deleted


(また、リレーショナルの観点からは、タプルを含まないセットも興味深い場合があります)

于 2013-03-13T08:37:16.827 に答える
0

SQLトリガーは、テーブルに関連付けられているイベントが発生するたびに実行または起動されます。たとえば、selectステートメントではなく、挿入、更新、削除などです。トリガーを再回転させて、テーブルが更新、挿入、または削除されていることを確認します。

よろしく、sa.va3feb

于 2013-03-13T08:48:27.020 に答える