Toon posts:

[MS SQL2000] Lastig probleem met een trigger

Pagina: 1
Acties:

Verwijderd

Topicstarter
Na uren zoeken en proberen geef ik de moed op. Ik wil een trigger bouwen die het volgende uit gaat voeren: bij het toevoegen of wijzigen van een product, moet (indien het een nieuw product is, of de prijs van het product aangepast is) er in de tabel Prijs_Historie een record met de nieuwe prijs toegevoegd worden.

Tabel waar de trigger op moet komen ziet er simpel, zo uit:
Producten (productid, prijs)

De tabel Prijs_Historie ziet er zo uit:
Prijs_Historie(productid, prijs, datum)

Dit had ik al geprobeerd. Echter, deze trigger gaat bij iedere aanpassing aan de tabel af (op de productnaam bijvoorbeeld, terwijl ik wil dat hij alleen bij een prijs aanpassing af gaat). Ook insert hij niet het bepaalde record, maar insert hij de complete tabel in de historie tabel.

code:
1
2
3
4
5
CREATE TRIGGER [test] ON [database].[producten] 
FOR INSERT, UPDATE 
AS
insert Prijs_Historie (productid, prijs, datum)  
(Select productid, prijs, getdate() from producten where producten.productid in (select productid from producten))


Ook met de MSDN en mijn SQL boek kom ik niet veel verder :'(

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:26
In een trigger heb je de beschikking over de speciale 'inserted' en 'deleted' tables.
Die tabellen bevatten dus de records die toegevoegd of verwijderd zijn door de actie die die trigger triggeren.

code:
1
2
3
4
5
CREATE TRIGGER [test] on [database].[producten]
FOR INSERT, UPDATE
AS
INSERT INTO prijs_historie ( productid, prijs, datum)
SELECT productid, prijs, datum FROM inserted


Die inserted/deleted tables moeten toch echt wel in de MSDN vermeld staan hoor
Ook insert hij niet het bepaalde record, maar insert hij de complete tabel in de historie tabel.

code:
1
2
3
4
5
CREATE TRIGGER [test] ON [database].[producten] 
FOR INSERT, UPDATE 
AS
insert Prijs_Historie (productid, prijs, datum)  
(Select productid, prijs, getdate() from producten where producten.productid in (select productid from producten))
Da's logisch, als je eens dat SELECT statement goed bekijkt; je selecteert daar gewoon alle producten; je zegt: selecteer alle producten die het id hebben van (selecteer alle productids).

[ Voor 50% gewijzigd door whoami op 04-08-2005 22:18 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dat was het inderdaad, ik had die hele tabellen over het hoofd gezien.
Thanks

Als mensen dit probleem ook eens hebben, dit was de uiteindelijke oplossing:

code:
1
2
3
4
5
6
7
8
CREATE TRIGGER [upd_Prijs] ON [database].[producten] 
FOR update
AS
IF (SELECT prijs FROM inserted) <> (SELECT prijs FROM deleted)
BEGIN
    INSERT INTO prijs_historie ( productid, prijs, datum)
    SELECT productid, prijs ,getdate() FROM inserted
END

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:26
Verwijderd schreef op donderdag 04 augustus 2005 @ 22:30:

Als mensen dit probleem ook eens hebben, dit was de uiteindelijke oplossing:

code:
1
IF (SELECT prijs FROM inserted) <> (SELECT prijs FROM deleted)
Dat kan je ook zo schrijven:
code:
1
IF UPDATE (prijs)

https://fgheysels.github.io/


  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08-2025
Moet je niet een join doen op inserted en deleted om alleen de regels te krijgen waarvan de prijs veranderd is?
Als er meerdere regels tegelijk worden gewijzigd maar van slechts 1 wordt de prijs gewijzigd dan krijg je nu bij al die regels een prijs_historie regel.

| Toen / Nu


  • Haploid
  • Registratie: Maart 2002
  • Laatst online: 29-12-2021

Haploid

Doh!

SuperRembo schreef op vrijdag 05 augustus 2005 @ 07:54:
Moet je niet een join doen op inserted en deleted om alleen de regels te krijgen waarvan de prijs veranderd is?
Als er meerdere regels tegelijk worden gewijzigd maar van slechts 1 wordt de prijs gewijzigd dan krijg je nu bij al die regels een prijs_historie regel.
Je hebt gelijk. Deze oplossing gaat ervanuit dat er altijd 1 record tegelijk wordt gewijzigd. Wat je kunt doen om t netter te maken is:
SQL:
1
2
3
4
5
6
7
CREATE TRIGGER [upd_Prijs] ON [database].[producten] 
FOR update
AS
    INSERT INTO prijs_historie (productid, prijs, datum)
    SELECT productid, prijs, getdate() FROM inserted
    WHERE NOT EXISTS(SELECT 1 FROM deleted 
        WHERE deleted.productid=inserted.productid AND deleted.prijs=inserted.prijs)

[ Voor 4% gewijzigd door Haploid op 05-08-2005 08:47 ]

Hey, I came here to be drugged, electrocuted and probed, not insulted.

Pagina: 1