我遇到了更新触发器的编程问题。我想创建一个触发器,用新数据和新ID复制在新行中编辑的行。旧的行应该是相同的,从0到1SQL更新触发器无法按预期方式工作
表看起来像这只是一个标志变化:
ID Artikelname PREIS UPDATE_DATE FLAG
1 Tomatoe 3 14.06.2012 16:00 0
2 Apple 1,5 12.05.2012 14:45 0
当我改变了第一排的价格,表应该是这样的:
ID Artikelname PREIS UPDATE_DATE FLAG
1 Tomatoe 3 14.06.2012 16:00 1
2 Apple 1,5 12.05.2012 14:45 0
1 Tomatoe 2 13.07.2012 10:45 0
这里是我的触发至今:
USE [TestDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Produkt_Update]
ON [dbo].[Produkt]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
DECLARE @ID int
DECLARE @Artikelname nvarchar(50)
DECLARE @Preis numeric
DECLARE @Flag numeric
DECLARE @max_id int
SET @ID = (SELECT ID FROM inserted)
SET @Artikelname = (SELECT Artikelname FROM inserted)
SET @Preis = (SELECT Preis FROM inserted)
SET @Flag = (SELECT Flag FROM inserted)
SET @max_id = (SELECT MAX(ID) from dbo.Produkt)
SET IDENTITY_INSERT dbo.Produkt ON
INSERT INTO dbo.Produkt
(ID,Artikelname,Preis)
values (@max_id+1,@Artikelname,@Preis)
SET IDENTITY_INSERT dbo.Produkt OFF
UPDATE dbo.Produkt
SET Flag = 1
WHERE [email protected]
END
随着我触发我可以创建新行但第一排窗台上的价格发生了变化。我不知道如何处理这个问题。请问你能帮帮我吗?
难道是因为e它是更新后的触发器,在记录更新完成后会触发?更新之前触发器不存在,但您可以尝试使用替代触发器,我相信。有了这个你的sql语句被触发器的内容'替换' – Rob 2012-07-13 08:56:18
一个主要问题:你似乎期望'Inserted'将总是只包含一行。不是这种情况!如果你的'UPDATE'语句更新了10行,那么'Inserted'将包含10行,你的语句像'SET @ID =(SELECT ID FROM inserted)'将会失败惨剧..... – 2012-07-13 09:34:36