2012-07-13 129 views
1

我遇到了更新触发器的编程问题。我想创建一个触发器,用新数据和新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 

随着我触发我可以创建新行但第一排窗台上的价格发生了变化。我不知道如何处理这个问题。请问你能帮帮我吗?

+0

难道是因为e它是更新后的触发器,在记录更新完成后会触发?更新之前触发器不存在,但您可以尝试使用替代触发器,我相信。有了这个你的sql语句被触发器的内容'替换' – Rob 2012-07-13 08:56:18

+0

一个主要问题:你似乎期望'Inserted'将总是只包含一行。不是这种情况!如果你的'UPDATE'语句更新了10行,那么'Inserted'将包含10行,你的语句像'SET @ID =(SELECT ID FROM inserted)'将会失败惨剧..... – 2012-07-13 09:34:36

回答

4

请试试这个,让我知道

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; 
+0

我收到此错误:错误8101只有在使用列列表并且IDENTITY_INSERT为ON时,才能指定表中标识列的显式值。 – 2012-07-13 09:18:38

+0

@ErayGeveci:如果ID是标识列,那么您必须SET IDENTITY_INSERT [Produkt] ON ..现在我已经更新了我的query.please检查 – 2012-07-13 09:29:45

+0

它的工作原理,非常感谢。你能解释一下你的代码吗? – 2012-07-13 09:35:31

-1

更换

SET @ID = (SELECT ID FROM inserted) 

SET @ID = (SELECT ID FROM deleted) 
+0

当我改变价格产品它仍然保存更改的值 – 2012-07-13 09:04:52

0

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

+0

我试过了,现在我在新的行中有旧价格。新的价格在编辑的行中。我需要相反的 – 2012-07-13 09:30:50

相关问题