<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title><![CDATA[Forum PostgreSQL - Historia zmian]]></title>
		<link>https://forum.postgresql.org.pl/viewtopic.php?id=21</link>
		<description><![CDATA[Najświeższe odpowiedzi w Historia zmian.]]></description>
		<lastBuildDate>Wed, 19 Jan 2011 11:13:09 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2355#p2355</link>
			<description><![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.]]></description>
			<author><![CDATA[dummy@example.com (adamleon)]]></author>
			<pubDate>Wed, 19 Jan 2011 11:13:09 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2355#p2355</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2354#p2354</link>
			<description><![CDATA[No to własnie o czymś takim pisałem. Triggery after są w postgresie.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Wed, 19 Jan 2011 10:46:53 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2354#p2354</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2352#p2352</link>
			<description><![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 ??]]></description>
			<author><![CDATA[dummy@example.com (adamleon)]]></author>
			<pubDate>Wed, 19 Jan 2011 07:01:45 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2352#p2352</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2351#p2351</link>
			<description><![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ą.]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Tue, 18 Jan 2011 18:23:32 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2351#p2351</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=2350#p2350</link>
			<description><![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.]]></description>
			<author><![CDATA[dummy@example.com (adamleon)]]></author>
			<pubDate>Tue, 18 Jan 2011 07:52:44 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=2350#p2350</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=65#p65</link>
			<description><![CDATA[Jasne, dzięki.  :)]]></description>
			<author><![CDATA[dummy@example.com (snake785)]]></author>
			<pubDate>Thu, 03 Apr 2008 21:54:16 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=65#p65</guid>
		</item>
		<item>
			<title><![CDATA[Odp: Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=64#p64</link>
			<description><![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?]]></description>
			<author><![CDATA[dummy@example.com (rski)]]></author>
			<pubDate>Thu, 03 Apr 2008 17:15:50 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=64#p64</guid>
		</item>
		<item>
			<title><![CDATA[Historia zmian]]></title>
			<link>https://forum.postgresql.org.pl/viewtopic.php?pid=63#p63</link>
			<description><![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]]></description>
			<author><![CDATA[dummy@example.com (snake785)]]></author>
			<pubDate>Thu, 03 Apr 2008 11:03:59 +0000</pubDate>
			<guid>https://forum.postgresql.org.pl/viewtopic.php?pid=63#p63</guid>
		</item>
	</channel>
</rss>
