Sqlserver Express を使用していますが、before updated
トリガーを実行できません。それを行う他の方法はありますか?
9 に答える
MSSQL に「before トリガー」がないことは事実です。ただし、「挿入」テーブルと「削除」テーブルを一緒に使用することで、テーブルに加えられた変更を追跡できます。更新によってトリガーが起動すると、「挿入された」テーブルには新しい値が格納され、「削除された」テーブルには古い値が格納されます。この情報があれば、「トリガー前」の動作を比較的簡単にシミュレートできます。
BEFORE
MSSQLはトリガーをサポートしていません。最も近いのはINSTEAD OF
トリガーですが、その動作はBEFORE
MySQLのトリガーの動作とは異なります。
これらの詳細については、ここで学ぶことができます。またINSTEAD OF
、トリガーは「トリガーSQLステートメントの代わりにトリガーが実行されることを指定し、トリガーステートメントのアクションをオーバーライドする」ことに注意してください。したがって、トリガーが適切に記述/処理されていない場合、更新に対するアクションが実行されない可能性があります。カスケードアクションも影響を受けます。
代わりに、達成しようとしていることに別のアプローチを使用することをお勧めします。
これが SQL Server Expressに適用されるかどうかはわかりませんが、更新後にトリガーが発生した場合でも、「前」のデータにアクセスできます。テーブルが変更されたときにその場で作成される、削除または挿入されたテーブルからデータを読み取る必要があります。これは本質的に@Stamenが言っていることですが、その(役立つ!)答えを理解するには、さらに調査する必要がありました。
削除されたテーブルには、DELETE および UPDATE ステートメント中に影響を受ける行のコピーが格納されます。DELETE または UPDATE ステートメントの実行中に、行はトリガー テーブルから削除され、削除されたテーブルに転送されます...
挿入されたテーブルには、INSERT および UPDATE ステートメント中に影響を受ける行のコピーが格納されます。挿入または更新トランザクション中に、挿入されたテーブルとトリガー テーブルの両方に新しい行が追加されます...
したがって、トリガーを作成して、これらのテーブルのいずれかからデータを読み取ることができます。
CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
BEGIN
INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
SELECT <columns...>, getdate()
FROM deleted;
END;
私の例は、次のものに基づいています。
T-SQLは、AFTERおよびINSTEAD OFトリガーのみをサポートし、他のRDBMSに見られるように、BEFOREトリガーを備えていません。
INSTEADOFトリガーを使用することをお勧めします。
SQLServerのすべての「通常の」トリガーは「AFTER...」トリガーです。「BEFORE...」トリガーはありません。
更新前に何かを行うには、INSTEADOFUPDATEトリガーを確認してください。
SQL Server で行うBEFORE UPDATE
には、あるトリックを使用します。レコードの誤った更新 ( UPDATE Table SET Field = Field
) を実行して、レコードの前のイメージを取得します。