0

次のトリガーがあります。

ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
   ON [dbo].[DIENSTLEISTUNG]
   INSTEAD OF UPDATE
AS
BEGIN
    SET  NOCOUNT ON;

    INSERT INTO [DIENSTLEISTUNG] (BEZEICHNUNG, MENGENEINHEIT, 
        PREIS, BESCHREIBUNG, VORLAUFZEIT,
        AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
        AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
        UPDATE_USER, UPDATE_DATE, RUESTZEIT,
        PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
        ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,FLAG)

    SELECT  BEZEICHNUNG, MENGENEINHEIT, 
        PREIS, BESCHREIBUNG, VORLAUFZEIT,
        AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
        AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
        UPDATE_USER,GETDATE(),RUESTZEIT,
        PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
        ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,
        0 
    FROM INSERTED

    UPDATE  DIENSTLEISTUNG
    SET     DIENSTLEISTUNG.FLAG = 1 
    FROM    DIENSTLEISTUNG 
            INNER JOIN INSERTED
            ON INSERTED.ID = DIENSTLEISTUNG.ID            
SET NOCOUNT OFF;    
END

元の行が変更された場合、Trigger は行全体を新しい ID でコピーします。また、新しい行と古い行に FLAG を設定します (古い行は FLAG = 1、新しい行は FLAG = 0 になります)。

FLAG = 0 の新しい行のみを返すように、トリガー内からこれらの行をフィルタリングすることは可能ですか?

はいの場合、どうすればそれを行うことができますか?

前もって感謝します!

4

2 に答える 2

1

求めているのが選択トリガーである場合、いいえ、MS SQL Server は選択トリガーをサポートしていません。

FLAGただし、次のような、列が 1 であるテーブルの行のみを返すビューを使用できます。

create view dbo.DIENSTLEISTUNG_Flagged
as 
  select * from DIENSTLEISTUNG
  where FLAG=1

ただし、履歴レコードをそのまま配置するのではなく、追加のテーブルを用意することをお勧めします。そうすれば、タイムスタンプ、行を変更したユーザー、行を変更したアプリケーションなどの追加フィールドを追加できます...
(トリガーの疑似コード)の行に沿ったもの

Insert into ServicesHistory (..., ChangeDate)
Select ... , getdate() from inserted

これにより、「代わりに」トリガー (純粋な悪) が通常のトリガー (やや悪) に変換されることに注意してください。

于 2012-07-17T13:28:17.043 に答える
1

おそらく、最初に既存の行を更新してから、フラグ 0 で新しい行を挿入するつもりだったと思います。

ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
INSTEAD OF UPDATE
AS
BEGIN
  SET  NOCOUNT ON;

  UPDATE  d
  SET     FLAG = 1
  FROM    dbo.DIENSTLEISTUNG AS d
          INNER JOIN inserted AS i
          ON i.ID = d.ID;

  INSERT INTO dbo.[DIENSTLEISTUNG] 
  (
      BEZEICHNUNG, MENGENEINHEIT, 
      PREIS, BESCHREIBUNG, VORLAUFZEIT,
      AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
      AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
      UPDATE_USER, UPDATE_DATE, RUESTZEIT,
      PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
      ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH,FLAG
  )
  SELECT  BEZEICHNUNG, MENGENEINHEIT, 
      PREIS, BESCHREIBUNG, VORLAUFZEIT,
      AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
      AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
      UPDATE_USER,GETDATE(),RUESTZEIT,
      PERMISSIONS, KONTRAKTPOSITION,ARTIKELNUMMER,
      ANZAHL, BUCHUNGSHINWEIS, SONDERWUNSCH, 0 
  FROM inserted;
END
于 2012-07-17T13:28:17.793 に答える