预过滤带有触发器的SQL表

时间:2012-07-17 13:22:42

标签: sql sql-server-2008 triggers

我有以下触发器:

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)。

是否可以在Trigger中过滤这些行,以便它只返回FLAG = 0的新行?

如果是,我该怎么做?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果您要求的是Select触发器,那么,NO,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

请注意,这也会将你的'而不是'触发器(纯邪恶)转换为常规触发器(稍微不那么邪恶)

答案 1 :(得分: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