2012-07-13 1 views
1

J'ai un problème avec la programmation d'un déclencheur de mise à jour. Je souhaite créer un déclencheur qui copie la ligne que j'ai modifiée dans une nouvelle ligne avec les nouvelles données et un nouvel ID. L'ancienne ligne doit être la même chose avec un simple changement de drapeau de 0 à 1.Le déclencheur de mise à jour SQL ne fonctionne pas comme prévu

Le look de table comme ceci:

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 

Quand je change le prix de la première ligne, la table devrait ressembler à ceci :

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 

Voici mon déclencheur jusqu'à présent:

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 

Avec mon déclencheur je peux créer la nouvelle ligne mais le prix sur le seuil de la première rangée change. Je ne sais pas comment gérer ça. Pourrais-tu m'aider s'il te plait?

+0

Pourrait-il être e s'agit-il d'un déclencheur après mise à jour qui se déclenchera après la mise à jour de l'enregistrement? Un trigger avant la mise à jour n'existe pas, mais vous pouvez essayer avec un trigger au lieu de trigger je crois. Avec ceci votre instruction sql est 'remplacée' par le contenu du déclencheur – Rob

+0

Un problème principal: vous semblez vous attendre à ce que 'Inserted' contienne toujours une seule ligne. Ce n'est pas le cas! Si votre instruction 'UPDATE' met à jour 10 lignes, alors' Inserted' contiendra 10 lignes et vos instructions comme 'SET @ID = (SELECT ID FROM inséré)' échoueront lamentablement ..... –

Répondre

4

S'il vous plaît essayez et laissez-moi savoir

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

je reçois cette erreur: erreur 8101 une valeur explicite pour la colonne d'identité dans le tableau ne peut être spécifié lorsqu'une liste de colonne est utilisée et IDENTITY_INSERT est sur –

+0

@ErayGeveci: Si ID est une colonne d'identité, vous avoir à SET IDENTITY_INSERT [Produkt] ON .. Maintenant, j'ai mis à jour ma requête.Veuillez vérifier –

+0

cela fonctionne, merci beaucoup. pourriez-vous expliquer votre code un peu? –

-1

Remplacer

SET @ID = (SELECT ID FROM inserted) 

avec

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

quand je change le prix d'un produit, il sauve encore la valeur modifiée –

0

Vous devez insérer le prix (preis) de la table supprimée, pas table insérée

+0

J'ai essayé cela, maintenant j'ai l'ancien prix dans la nouvelle rangée. et le nouveau prix est dans la ligne éditée. j'ai besoin du contraire –

Questions connexes