SQLサーバーでBEFORE UPDATEDトリガーを実行するにはどうすればよいですか?
-
22-07-2019 - |
質問
Sqlserverエクスプレスを使用していますが、更新前
トリガーを実行できません。別の方法がありますか?
解決
MSSQLは BEFORE
トリガーをサポートしていません。最も近いのは INSTEAD OF
トリガーですが、その動作はMySQLの BEFORE
トリガーの動作とは異なります。
それらの詳細については、こちらをご覧ください。 、および INSTEAD OF
トリガー"トリガーSQLステートメントの代わりにトリガーが実行されることを指定し、トリガーステートメントのアクションをオーバーライドすることに注意してください。したがって、トリガーが適切に記述/処理されていない場合、更新に対するアクションが実行されない場合があります。カスケードアクションも影響を受けます。
代わりに、達成しようとしていることに対して別のアプローチを使用することもできます。
他のヒント
「前トリガー」が存在しないのは事実です。 MSSQLで。ただし、「挿入」を使用して、テーブルで行われた変更を追跡できます。および「削除済み」一緒にテーブル。更新によりトリガーが起動されると、「挿入」テーブルは新しい値と「削除済み」を保存します;テーブルには古い値が格納されます。この情報を取得すると、「トリガー前」を比較的簡単にシミュレートできます。振る舞い。
これがSQL Server Express に適用されるかどうかはわかりませんが、「前」にアクセスできます。更新後にトリガーが発生している場合でもデータ。テーブルが変更されたときにその場で作成される deleted または inserted テーブルのいずれかからデータを読み取る必要があります。これは基本的に@Stamenの言うことですが、その(役に立つ!)答えを理解するために、さらに探求する必要がありました。
deleted テーブルには、DELETEおよび UPDATEステートメント。 DELETEまたはUPDATEの実行中 ステートメント、行はトリガーテーブルから削除され、に転送されます 削除されたテーブル...
挿入テーブルには、INSERT中に影響を受ける行のコピーが保存されます およびUPDATEステートメント。挿入または更新トランザクション中に、新しい 行は挿入されたテーブルとトリガーテーブルの両方に追加されます...
したがって、これらのテーブルの1つからデータを読み取るトリガーを作成できます。例:
CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
BEGIN
INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
SELECT <columns...>, getdate()
FROM deleted;
END;
私の例は、次の例に基づいています。
sql-server < class = "post-tag" href = "/ questions / tagged / triggers" title = "'triggers'タグ付きの質問を表示" rel = "tag">トリガー
T-SQLはAFTERおよびINSTEAD OFトリガーのみをサポートします。他のRDBMSに見られるようなBEFOREトリガーはありません。
INSTEAD OFトリガーを使用したいと思うと思います。
すべての「通常」 SQL Serverのトリガーは&quot; AFTER ...&quot;です。トリガー。 「前に...」はありません。トリガー。
更新前に何かをするには、 INSTEAD OF UPDATE Triggers をチェックしてください。 a>。
SQL Serverで BEFORE UPDATE
を実行するには、トリックを使用します。レコードの誤った更新を行い( UPDATE Table SET Field = Field
)、その方法でレコードの前の画像を取得します。
代わりにトリガーを使用する場合、トリガーで特に指定しない限り、挿入をコミットしないことに注意してください。実際の代わりに、あなたが通常行うことの代わりにこれを行うので、通常の挿入アクションは発生しません。
完全な例:
CREATE TRIGGER [dbo].[trig_020_Original_010_010_Gamechanger]
ON [dbo].[T_Original]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Old_Gamechanger int;
DECLARE @New_Gamechanger int;
-- Insert statements for trigger here
SELECT @Old_Gamechanger = Gamechanger from DELETED;
SELECT @New_Gamechanger = Gamechanger from INSERTED;
IF @Old_Gamechanger != @New_Gamechanger
BEGIN
INSERT INTO [dbo].T_History(ChangeDate, Reason, Callcenter_ID, Old_Gamechanger, New_Gamechanger)
SELECT GETDATE(), 'Time for a change', Callcenter_ID, @Old_Gamechanger, @New_Gamechanger
FROM deleted
;
END
END