SQL更新触发器未按预期工作

SQL更新触发器未按预期工作,sql,sql-server,triggers,Sql,Sql Server,Triggers,我对更新触发器的编程有问题。我想创建一个触发器,用新数据和新ID复制我在新行中编辑的行。旧行应该是相同的,只是标志从0更改为1 该表如下所示: 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

我对更新触发器的编程有问题。我想创建一个触发器,用新数据和新ID复制我在新行中编辑的行。旧行应该是相同的,只是标志从0更改为1

该表如下所示:

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
当我更改第一行的价格时,该表应如下所示:

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 ID=@ID
END
使用触发器,我可以创建新行,但第一行的价格会发生变化。我不知道怎么处理这件事。你能帮我吗?

替换

 SET @ID = (SELECT ID FROM inserted) 


请试试这个,让我知道

CREATE TRIGGER [dbo].[Produkt_Update]
   ON [dbo].[Produkt]
   AFTER  UPDATE
AS
BEGIN
 SET  NOCOUNT ON;

    DECLARE @MAX_ID INT;
    SELECT @MAX_ID=MAX(ID) FROM [Produkt];

    declare @tmp Table(ID  int,     Artikelname  varchar(200),
    PREIS varchar(200),UPDATE_DATE datetime,      FLAG bit)

    insert into @tmp
    select ID,Artikelname,PREIS,UPDATE_DATE,1 [flag] from deleted;

    delete T from [Produkt] T JOIN @tmp I
    ON T.ID=I.ID

SET IDENTITY_INSERT   [Produkt] ON
INSERT INTO [Produkt] (ID,Artikelname,PREIS,UPDATE_DATE,FLAG)
SELECT @MAX_ID+ROW_NUMBER() OVER(ORDER BY ID) [ID],Artikelname,PREIS,GETDATE(),0 
FROM INSERTED
union all
select * from @tmp

 SET IDENTITY_INSERT dbo.Produkt OFF
 SET  NOCOUNT OFF;
END;

您需要从已删除的表中插入price preis,而不是插入的表

可能是因为它是一个更新后触发器,在记录更新完成后将触发它?更新前触发器不存在,但我相信您可以尝试使用替代触发器。这样,您的sql语句就被triggerOne主问题的内容“替换”了:您似乎希望插入的语句总是只包含一行。事实并非如此!如果UPDATE语句更新了10行,然后Inserted将包含10行,您的语句(如SET@ID=SELECT ID FROM Inserted)将失败得很惨……当我更改产品价格时,它仍会保存更改后的值。我得到以下错误:错误8101只有在使用列列表并插入标识时,才能为表中的标识列指定显式值ON@ErayGeveci:如果ID是一个标识列,则必须将identity\u INSERT[Produkt]设置为ON。。现在我已经更新了我的查询。请检查它是否有效,非常感谢。你能稍微解释一下你的代码吗?有两个系统叫做inserted和deleted,它只能在触发器中访问。这两个表与基表的结构相同。更新行时,旧记录将在删除的表中可用,新记录将在插入的表中可用。我正在做的是1。从更新为2的表中删除记录。从插入的表中插入一条记录到实际表中,新Id为3。从删除的表中插入一条记录,因为它是可以问您另一个问题的吗?我在另一个数据库上测试了它,编辑后出现了一个错误:DELETE语句与引用约束冲突。如何在不删除的情况下使用您的解决方案。有可能吗?我试过了,现在我把旧的价格放在了新的一排。新的价格在编辑的行中。我需要相反的东西