我有以下触发器:
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的新行?
如果是,我该怎么做?
提前致谢!
答案 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