2

SQL Server とトリガーで (とにかく私にとって) 本当に奇妙なことを経験しました。詳細は次のとおりです - どれが関連するかわからないので、リストします (何か見逃した場合は、質問してください)。

  • トリガーのタイプ:INSTEAD OF INSERT
  • それはテーブルの唯一のトリガーです
  • 問題のデータベースは、トリガーを持つ(既存のデータベースから)コピーされました-私はこのコピーを実行しませんでした(そのためにどの方法が使用されたかわかりません)。
  • コピーされたデータベース テーブルには、制約付きの新しい列が含まれています。すべてではないにしても、ほとんどが NOT NULL です。
  • トリガーは、私が行うまで決して変更されませんでした-制約のある新しい列を考慮していませんでした

わかりましたので、ここに行きます:トリガーは、私が変更するまで呼び出されなかったようですそして、何が起こっているのかを見ることができるようになったので、すべて「予期される動作」である問題を引き起こし始めました)。

  • (新しい) DB テーブルには NOT NULL 制約を持つ新しい列があり、元のトリガー (INSERT) はこれを考慮していないため、INSERT は期待どおりに失敗します
  • ただし、トリガーを変更する前に、INSERTは成功しました!! 繰り返しますが、このトリガーは新しい列を考慮していないことに注意してください...私の ALTER でさえそれらを考慮していませんでした (私のエラー) - ALTER アクションによって何かを「修正」したわけではありません。ただし、結果/動作の違い、前 (予期しない INSERT が成功する) と私の ALTER TRIGGER (INSERT が期待どおりに失敗する) の後は困惑しています....

トリガーをALTERING すると「有効にする」という趣旨のリソースを見つけることができませんでした-無効になっていると仮定します-これがすべてを理解できる唯一の方法です...

それで、トリガーと関係があるデータベースのコピー(ing)について何かがあるようですか?ALTERトリガーがトリガーを突然生き返らせるのはなぜですか (またはむしろそうなるのでしょうか) (明示的にENABLE-ingせずに)。

私は決して DBA や SQL の第一人者ではないので、それが明白であれば、恥の殿堂に入れられても問題ありません....

4

1 に答える 1

3

ドキュメントでも見つけられませんでしたがALTER、トリガーを使用すると実際に有効になるようです。

create table dbo.t (col1 int)
go

create trigger tr on dbo.t instead of insert as insert into dbo.t values(1)
go

disable trigger tr on dbo.t
go

-- returns 1
select is_disabled from sys.triggers where parent_id = object_id('dbo.t')
go

alter trigger tr on dbo.t instead of insert as insert into dbo.t values(2)
go

-- now returns 0
select is_disabled from sys.triggers where parent_id = object_id('dbo.t')
go

drop table dbo.t
go

それがあなたが見ている行動を説明していると思います。完全な推測をしなければならない場合、それALTER TRIGGERは(トランザクションの)構文糖衣であり、その後にDROP TRIGGER続くCREATE TRIGGERため、トリガーは実際に再作成されるため再度有効になりますが、これは純粋な推測です.

于 2013-06-06T19:20:14.667 に答える