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

如果原始行发生更改,触发器会复制具有新 ID 的整行。它还在新行和旧行中设置了一个 FLAG(旧行获得 FLAG = 1,新行 FLAG = 0)。

是否可以从触发器中过滤这些行,使其仅返回 FLAG = 0 的新行?

如果是,我该怎么做?

提前致谢!

4

2 回答 2

1

如果您要求的是选择触发器,那么,不,MS SQL Server 不支持选择触发器。

但是,您可以使用仅返回列为 1 的表中的那些行的视图,FLAG例如

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 回答