1

Temat: Historia zmian

Witam,

analizuję sobie taki problem:

w bazie danych klientów klienci mogą dokonywać zmian. Wystawiam im różne dokumenty z tymi ich danymi. No i jeśli stare dane klienta byłyby po prostu zastępowane nowymi - nie byłoby możliwości sięgnięcia po te stare dane.

I teraz mam pytanie, jakie macie podejście do tego:

- zastępujecie stare dane zapominając o nich
- tworzycie sobie jakąś historię zmian i trzymacie "przy klientach"
- trzymacie dane "przy dokumentach" (zbyt wiele dublowania byłoby jak na mój gust)
- a może ktoś gdzieś opisał jak to robią profesjonaliści i ktoś wie smile bo mnie goole nie chciało powiedzieć a i w książkach, które mam tego problemu jakoś nikt nie poruszył

Dzięki za wszelkie głosy smile

Nelka

2

Odp: Historia zmian

W sumie nie wiem jak to robia profesjonalisci, ale moze wystarczy zrobic sobie tabele ze starymi danymi, napisac wyzwalacz, który by ja automatycznie aktualizowal, i oczywiscie polaczenie pomiedzy tabela z klientami a tabela ze starymi danymi powinno byc wiele-wiele, bo zakladam ze kazdy klient moze wiele razy zmieniac dane. Jasne?

3

Odp: Historia zmian

Jasne, dzięki.  smile

4

Odp: Historia zmian

Witam
Mam podobne pytanie. Robię historię zmiana w tabeli. W tabeli histori mam kolumny nowa_cena,stara_cena itd dla wszystkich kolumn które mozna edytować.
Mam trigger before update dla tabeli żródłowej i funkcję która zapisuje stara wartość w pole stara_cena i nową w pole nowa_cena. I tak w jednym rekordzie mam po dwa pola z wartością starą i nową dla każdego pola. Jeżeli np: w tabeli żródłowej mam 5 kolumn to w historycznej 10. Nie przeszkadza mi to ale np jeżeli zmieniam tylko jedno pole to i tak pozostałe pola się wypełniają danymi niezmienionymi. Można zrobić trigger na każde pole w tabeli i wtedy tabela historyczna miała by tylko 3 kolumny -> nazwa_kolumny,stara_wartosc,nowa_wartosc. Ale czy jest sens używac tyle triggerów ile jest pól w tabeli, żeby zaciągać tylko konkretne zmienione pole??

Nie wiem czy wyraziłem się jasno, ale jeżeli ktoś ma jakiś pomysł to chętnie się zapoznam.
Pozdrawiam
AdamP.

5

Odp: Historia zmian

Nie wiem czy załapałem problem, ale jeśli problemem są pola wypełniające się niezmienionymi danymi to może przed wpisaniem danych w pola historyczne warto sprawdzić, czy uległy one zmianie i w zależności od tego warunku aktualizować tabelę historyczną.
Może pokaż definicję triggera i funkcji wypełniającej tabelę historyczną.

6

Odp: Historia zmian

Mam tak

CREATE TRIGGER trigger_hist_zmiana
  BEFORE UPDATE OR DELETE
  ON tabela1
  FOR EACH ROW
  EXECUTE PROCEDURE fhist_zmiana();

CREATE OR REPLACE FUNCTION fhist_zmiana()
  RETURNS trigger AS
BEGIN
  IF tg_op = 'DELETE' THEN
     INSERT INTO tab_hist(pole1,pole2,pole3,pole4)
     VALUES (old.pole1,old.pole2,OLD.pole3,'delete');
     RETURN old;
  END IF;
  IF tg_op = 'UPDATE' THEN
     INSERT INTO tab_hist(pole1,pole2,pole3,pole4,pole1N,pole2N,pole3N)
     VALUES (old.pole1,old.pole2,OLD.pole3,'Update',new.pole1,new.pole2,new.pole3);
  RETURN new;
  END IF;
END
  LANGUAGE 'plpgsql'

ale znalazłem przykład na Oracle i wydaje mi się byc dobry do przerobienia mojego problemu, pola w tabeli Oracle (nazwa_pola, stara_wartosc, nowa_wartosc,data_zdarzenia,uzytkownik)

CREATE OR REPLACE TRIGGER triggerek
AFTER UPDATE ON tabelka FOR EACH ROW
BEGIN
   if (:NEW.pole1 != :OLD.pole1) or ((:NEW.pole1 is null) and (:OLD.pole1 is not null)) or ((:NEW.pole1 is not null) and (:OLD.pole1 is null)) then
     -- zapis do tabeli tylko tego pola
   end if;
   if (:NEW.pole2 != :OLD.pole2) or ((:NEW.pole2 is null) and (:OLD.pole2 is not null)) or ((:NEW.pole2 is not null) and (:OLD.pole2 is null)) then
     -- zapis do tabeli tylko tego pola
   end if;
   -- itd dla wszystkich pól mogących się zmienić
END;

Mam jeszcze pytanko, mój trigger jest Before Update, a Oraclowy After Update. Nie wiem czy w Postgresie też zastosować After ??

7

Odp: Historia zmian

No to własnie o czymś takim pisałem. Triggery after są w postgresie.

8

Odp: Historia zmian

Tak, After jest, ale czy lepiej zrobić Before czy After? Dopiero zaczynam z triggerami i nie chciałbym napsuć.
A jeszcze jedno pytanie mam pole w tabeli typu double precision w którym jest wartość 0,000001 a w wyniku otrzymuje 1E-6. Używam PGAdmina i EMS Manager. W jaki sposób w zaptaniu SQL wyświetlić normalną postać ?? Zmiana pola na numeric nic nie zmienia. Rzutowałem na różne sposoby, ale nic mi nie wychodzi.