<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Historia zmian]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=21&amp;type=atom"/>
	<updated>2011-01-19T11:13:09Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=21</id>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2355#p2355"/>
			<content type="html"><![CDATA[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.]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2011-01-19T11:13:09Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2355#p2355</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2354#p2354"/>
			<content type="html"><![CDATA[No to własnie o czymś takim pisałem. Triggery after są w postgresie.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2011-01-19T10:46:53Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2354#p2354</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2352#p2352"/>
			<content type="html"><![CDATA[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 ??]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2011-01-19T07:01:45Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2352#p2352</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2351#p2351"/>
			<content type="html"><![CDATA[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ą.]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2011-01-18T18:23:32Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2351#p2351</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2350#p2350"/>
			<content type="html"><![CDATA[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.]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2011-01-18T07:52:44Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2350#p2350</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=65#p65"/>
			<content type="html"><![CDATA[Jasne, dzięki.  :)]]></content>
			<author>
				<name><![CDATA[snake785]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=54</uri>
			</author>
			<updated>2008-04-03T21:54:16Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=65#p65</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=64#p64"/>
			<content type="html"><![CDATA[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?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2008-04-03T17:15:50Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=64#p64</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Historia zmian]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=63#p63"/>
			<content type="html"><![CDATA[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 :) 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 :)

Nelka]]></content>
			<author>
				<name><![CDATA[snake785]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=54</uri>
			</author>
			<updated>2008-04-03T11:03:59Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=63#p63</id>
		</entry>
</feed>
