質問

Sqlserverエクスプレスを使用していますが、更新前トリガーを実行できません。別の方法がありますか?

役に立ちましたか?

解決

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

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

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

他のヒント

「前トリガー」が存在しないのは事実です。 MSSQLで。ただし、「挿入」を使用して、テーブルで行われた変更を追跡できます。および「削除済み」一緒にテーブル。更新によりトリガーが起動されると、「挿入」テーブルは新しい値と「削除済み」を保存します;テーブルには古い値が格納されます。この情報を取得すると、「トリガー前」を比較的簡単にシミュレートできます。振る舞い。

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

  

deleted テーブルには、DELETEおよび   UPDATEステートメント。 DELETEまたはUPDATEの実行中   ステートメント、行はトリガーテーブルから削除され、に転送されます   削除されたテーブル...

     

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

     

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

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

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

< 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

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
scroll top