Over het onderstaande probleem breek me al enkele dagen het hoofd, wellicht hebben jullie een idee.
Database: Postgresql
Tables:
Gewenst gedrag:
Wanneer er een update op gegevens plaatsvindt en er geen entry is in gegevens_update met dezelfde sleutel moet de oude entry in gegevens_update geplaatst worden.
Wanneer er een update op gegevens plaatsvindt en er reeds een entry in gegevens_update met dezelfde sleutel is EN {new}=={entry_in_gegevens_update} (uitgezonderd mutatie), verwijder entry uit gegevens_update.
Function die hier voor moet zorgen, is trigger die na UPDATE plaatsvindt:
Dit alles gaat prima wijziging in de velden: telefoonnummer, straatnaam, woonplaats en naam.
Maar het gaat verkeerd als er een wijziging plaatsvindt in straatnaam_toevoeging, voornaam of tussenvoegsel. Let op! Wijziging gaat van NULL naar een waarde.
Ik heb dus al geprobeerd om het op te lossen met:
Maar dit werkt niet. Wellicht hebben jullie een idee?
Database: Postgresql
Tables:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| CREATE TABLE gegevens ( sleutel SERIAL PRIMARY KEY, telefoonnummer VARCHAR(20) NOT NULL UNIQUE, straatnaam VARCHAR(24) NOT NULL, straatnaam_toevoeging VARCHAR(2), woonplaats VARCHAR(24) NOT NULL, voornaam TEXT, tussenvoegsel TEXT, naam TEXT NOT NULL, mutatie TIMESTAMP ); CREATE TABLE gegevens_update ( sleutel INTEGER NOT NULL PRIMARY KEY, telefoonnummer VARCHAR(20), straatnaam VARCHAR(24), straatnaam_toevoeging VARCHAR(2), woonplaats VARCHAR(24), voornaam TEXT, tussenvoegsel TEXT, naam TEXT, mutatie TIMESTAMP ); |
Gewenst gedrag:
Wanneer er een update op gegevens plaatsvindt en er geen entry is in gegevens_update met dezelfde sleutel moet de oude entry in gegevens_update geplaatst worden.
Wanneer er een update op gegevens plaatsvindt en er reeds een entry in gegevens_update met dezelfde sleutel is EN {new}=={entry_in_gegevens_update} (uitgezonderd mutatie), verwijder entry uit gegevens_update.
Function die hier voor moet zorgen, is trigger die na UPDATE plaatsvindt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| CREATE OR REPLACE FUNCTION update_entry() RETURNS trigger AS ' DECLARE update gegevens_update%ROWTYPE; BEGIN SELECT INTO update * FROM gegevens_update WHERE sleutel = OLD.sleutel; IF NOT FOUND AND NOT ( OLD.sleutel = NEW.sleutel AND OLD.telefoonnummer = NEW.telefoonnummer AND OLD.straatnaam = NEW.straatnaam AND (OLD.straatnaam_toevoeging = NEW.straatnaam_toevoeging OR (OLD.straatnaam_toevoeging IS NULL AND NEW.straatnaam_toevoeging IS NULL)) AND OLD.woonplaats = NEW.woonplaats AND (OLD.voornaam = NEW.voornaam OR (OLD.voornaam IS NULL AND NEW.voornaam IS NULL)) AND (OLD.tussenvoegsel = NEW.tussenvoegsel OR (OLD.tussenvoegsel IS NULL AND NEW.tussenvoegsel IS NULL)) AND OLD.naam = NEW.naam) THEN INSERT INTO gegevens_update(...<snip>...); ELSIF FOUND AND ( update.sleutel = NEW.sleutel AND update.telefoonnummer = NEW.telefoonnummer AND update.straatnaam = NEW.straatnaam AND (update.straatnaam_toevoeging = NEW.straatnaam_toevoeging OR (update.straatnaam_toevoeging IS NULL AND NEW.straatnaam_toevoeging IS NULL)) AND update.woonplaats = NEW.woonplaats AND (update.voornaam = NEW.voornaam OR (update.voornaam IS NULL AND NEW.voornaam IS NULL)) AND (update.tussenvoegsel = NEW.tussenvoegsel OR (update.tussenvoegsel IS NULL AND NEW.tussenvoegsel IS NULL)) AND update.naam = NEW.naam) THEN DELETE FROM gegevens_update WHERE sleutel = NEW.sleutel; END IF; RETURN NEW; END; ' LANGUAGE plpgsql; |
Dit alles gaat prima wijziging in de velden: telefoonnummer, straatnaam, woonplaats en naam.
Maar het gaat verkeerd als er een wijziging plaatsvindt in straatnaam_toevoeging, voornaam of tussenvoegsel. Let op! Wijziging gaat van NULL naar een waarde.
Ik heb dus al geprobeerd om het op te lossen met:
SQL:
1
2
| (update.tussenvoegsel = NEW.tussenvoegsel OR (update.tussenvoegsel IS NULL AND NEW.tussenvoegsel IS NULL)) |
Maar dit werkt niet. Wellicht hebben jullie een idee?