简体   繁体   English

SQL Update触发器无法按预期工作

[英]SQL Update trigger doesn't work as expected

I have a problem with the programming of an Update trigger. 我在编写Update触发器时遇到问题。 I want to create a trigger that copies the row I edited in a new row with the new data and a new ID. 我想创建一个触发器,使用新数据和新ID复制我在新行中编辑的行。 The old row should be the same with just a flag change from 0 to 1. 旧行应该相同,只有一个标志从0更改为1。

The table look like this: 表格如下:

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

When I change the price of the first row, the table should look like this: 当我更改第一行的价格时,表格应如下所示:

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

Here is my trigger so far: 到目前为止,这是我的触发器:

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

With my trigger I can create the new row but the price on the first row sill changes. 使用我的触发器,我可以创建新行,但第一行窗台上的价格会发生变化。 I don't know how to handle this. 我不知道如何处理这个问题。 Could you help me please? 请问你能帮帮我吗?

Please try this and let me know 请试试这个并告诉我

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;

您需要从已删除的表中插入价格(preis),而不是插入的表

Replace 更换

 SET @ID = (SELECT ID FROM inserted) 

with

SET @ID = (SELECT ID FROM deleted) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM