50

Sqlserver Express を使用していますが、before updatedトリガーを実行できません。それを行う他の方法はありますか?

4

9 に答える 9

45

MSSQL に「before トリガー」がないことは事実です。ただし、「挿入」テーブルと「削除」テーブルを一緒に使用することで、テーブルに加えられた変更を追跡できます。更新によってトリガーが起動すると、「挿入された」テーブルには新しい値が格納され、「削除された」テーブルには古い値が格納されます。この情報があれば、「トリガー前」の動作を比較的簡単にシミュレートできます。

于 2011-01-07T15:25:54.953 に答える
44

BEFOREMSSQLはトリガーをサポートしていません。最も近いのはINSTEAD OFトリガーですが、その動作はBEFOREMySQLのトリガーの動作とは異なります。

これらの詳細については、ここで学ぶことができます。またINSTEAD OF、トリガーは「トリガーSQLステートメントの代わりにトリガーが実行されることを指定し、トリガーステートメントのアクションをオーバーライドする」ことに注意してください。したがって、トリガーが適切に記述/処理されていない場合、更新に対するアクションが実行されない可能性があります。カスケードアクションも影響を受けます。

代わりに、達成しようとしていることに別のアプローチを使用することをお勧めします。

于 2009-03-13T14:02:48.160 に答える
14

これが SQL Server Expressに適用されるかどうかはわかりませんが、更新後にトリガーが発生した場合でも、「前」のデータにアクセスできます。テーブルが変更されたときにその場で作成される、削除または挿入されたテーブルからデータを読み取る必要があります。これは本質的に@Stamenが言っていることですが、その(役立つ!)答えを理解するには、さらに調査する必要がありました。

削除されたテーブルには、DELETE および UPDATE ステートメント中に影響を受ける行のコピーが格納されます。DELETE または UPDATE ステートメントの実行中に、行はトリガー テーブルから削除され、削除されたテーブルに転送されます...

挿入されたテーブルには、INSERT および UPDATE ステートメント中に影響を受ける行のコピーが格納されます。挿入または更新トランザクション中に、挿入されたテーブルとトリガー テーブルの両方に新しい行が追加されます...

https://msdn.microsoft.com/en-us/library/ms191300.aspx

したがって、トリガーを作成して、これらのテーブルのいずれかからデータを読み取ることができます。

CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
  BEGIN
    INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
    SELECT <columns...>, getdate()
    FROM deleted;
  END;

私の例は、次のものに基づいています。

http://www.seemoredata.com/en/showthread.php?134-Example-of-BEFORE-UPDATE-trigger-in-Sql-Server-good-for-Type-2-dimension-table-updates

于 2016-01-19T11:57:54.797 に答える
9

T-SQLは、AFTERおよびINSTEAD OFトリガーのみをサポートし、他のRDBMSに見られるように、BEFOREトリガーを備えていません。

INSTEADOFトリガーを使用することをお勧めします。

于 2009-03-13T13:57:35.533 に答える
4

SQLServerのすべての「通常の」トリガーは「AFTER...」トリガーです。「BEFORE...」トリガーはありません。

更新前に何かを行うには、INSTEADOFUPDATEトリガーを確認してください。

于 2009-03-13T13:58:45.440 に答える
2

SQL Server で行うBEFORE UPDATEには、あるトリックを使用します。レコードの誤った更新 ( UPDATE Table SET Field = Field) を実行して、レコードの前のイメージを取得します。

于 2012-05-03T14:16:44.663 に答える