<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=597&amp;type=atom"/>
	<updated>2011-06-07T08:05:05Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=597</id>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2564#p2564"/>
			<content type="html"><![CDATA[Faktycznie,przeoczylem....

Wszystko smiga, dziekuje bardzo za cale Wasze zainteresowanie.


Dziekuje i Pozdrawiam.

Patryk]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-07T08:05:05Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2564#p2564</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2559#p2559"/>
			<content type="html"><![CDATA[Nic dziwnego, że nie działa wyzwalanie dla INSERT i DELETE jak wpisałeś tylko dla UPDATE:

[code]CREATE TRIGGER sprzedaz_update
    AFTER UPDATE ON sprzedaz
    FOR EACH ROW
    EXECUTE PROCEDURE obrot_sprzedawcy();[/code]

[quote]Samo CREATE TRIGGER już podał rski.[/quote]

A propo przeoczeń w PostgreSQL polecam [url]http://stackoverflow.com/questions/6133107/extract-dateyyyy-mm-dd-from-timestamp-postgresql/6133146#6133146)[/url]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-06-07T01:32:19Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2559#p2559</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2558#p2558"/>
			<content type="html"><![CDATA[Witam,

Dziekuje za odpowiedz. Robie wszystko tak jak nalezy,mam kod:


        CREATE FUNCTION obrot_sprzedawcy() RETURNS TRIGGER AS $$
DECLARE
    delta numeric(9,2);
BEGIN
    IF (TG_OP = 'INSERT') THEN
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy + NEW.cena_finalna
        WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
        RAISE NOTICE 'Nowa sprzedaż, zwiększony obrót sprzedawcy % o % zł.',
            NEW.nr_sprzedawcy, NEW.cena_finalna;
        RETURN NEW;

    ELSIF (TG_OP = 'UPDATE') THEN
        delta := NEW.cena_finalna - OLD.cena_finalna;
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy + delta
        WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
        RAISE WARNING 'Korekta sprzedaży, obrót sprzedawcy % różnica % zł.',
            NEW.nr_sprzedawcy, delta;
        RETURN NEW;

    ELSE
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy - OLD.cena_finalna
        WHERE nr_sprzedawcy = OLD.nr_sprzedawcy;
        RAISE WARNING 'Anulowanie sprzedaży, obrót sprzedawcy % zmniejszony o % zł,',
            OLD.nr_sprzedawcy, OLD.cena_finalna;
        RETURN NEW;
    
    END IF;    
END;
$$ LANGUAGE plpgsql;

         
  CREATE TRIGGER sprzedaz_update
    AFTER UPDATE ON sprzedaz
    FOR EACH ROW
    EXECUTE PROCEDURE obrot_sprzedawcy();
    
    
    
----WYKORZYSTANIE----
--UPDATE:

s8201=> UPDATE sprzedaz SET cena_finalna=10000 WHERE nr_podwozia LIKE 'FR873432846523H98';
OSTRZEŻENIE:  Korekta sprzedaży, obrót sprzedawcy 631 różnica 100.00 zł.
UPDATE 1

--INSERT:   
    
     
     INSERT INTO klient(pesel, nazwisko, imie, kod_pocztowy, miasto, ulica_dom)
   values('78090726444','Banicki','Marian','80-312','Szymbark','Dolna 12');
     INSERT INTO sprzedaz VALUES ('78090726444', 'GD0920490329FD093', 631, 'Karta', '2009-04-20', 48440);
     
     
     
--DELETE:


    DELETE FROM sprzedaz WHERE pesel_klienta ~~ '78090726444' AND nr_podwozia ~~ 'GD0920490329FD093';





Nie dziala w tej funkcji opcja INSERT i DELETE . UPDATE jest ok-wyswietla komunikat.
W insercie i delete nie wyswietla komunikatow i nie zlicza tych nowych wartosci. W insercie najpierw wpisuje nowego klienta 
i nastepnie robie insert do tabeli sprzedaz jednak nic sie nie dzieje,tak samo przy delete. Cos robie zle? Moze zle trigger zapisalem?

Pozdr.]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-06T23:23:47Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2558#p2558</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2557#p2557"/>
			<content type="html"><![CDATA["A może (chociaż) Harry Potter?" ;)

[code]-- DROP FUNCTION IF EXISTS obrot_sprzedawcy();

CREATE FUNCTION obrot_sprzedawcy() RETURNS TRIGGER AS $$
DECLARE
    delta numeric(9,2);
BEGIN
    IF (TG_OP = 'INSERT') THEN
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy + NEW.cena_finalna
        WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
        RAISE NOTICE 'Nowa sprzedaż, zwiększony obrót sprzedawcy % o % zł.',
            NEW.nr_sprzedawcy, NEW.cena_finalna;
        RETURN NEW;

    ELSIF (TG_OP = 'UPDATE') THEN
        delta := NEW.cena_finalna - OLD.cena_finalna;
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy + delta
        WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
        RAISE WARNING 'Korekta sprzedaży, obrót sprzedawcy % różnica % zł.',
            NEW.nr_sprzedawcy, delta;
        RETURN NEW;

    ELSE
        UPDATE sprzedawca
        SET obrot_sprzedawcy = obrot_sprzedawcy - OLD.cena_finalna
        WHERE nr_sprzedawcy = OLD.nr_sprzedawcy;
        RAISE WARNING 'Anulowanie sprzedaży, obrót sprzedawcy % zmniejszony o % zł,',
            OLD.nr_sprzedawcy, OLD.cena_finalna;
        RETURN NEW;
    
    END IF;    
END;
$$ LANGUAGE plpgsql;[/code]

Samo CREATE TRIGGER już podał rski.

Przykład:

[code]grzegorz=> \t
Showing only tuples.
grzegorz=> INSERT INTO sprzedaz VALUES ('78090726444', 'RE93032MFSDI203VE', 631, 'Karta', '2011-06-06', 355.50);
NOTICE:  Nowa sprzedaż, zwiększony obrót sprzedawcy 631 o 355.50 zł.
INSERT 0 1
grzegorz=> SELECT obrot_sprzedawcy FROM sprzedawca WHERE nr_sprzedawcy = 631;
         20255.50

grzegorz=> UPDATE sprzedaz SET cena_finalna = 200 WHERE pesel_klienta ~~ '78090726444' AND nr_podwozia ~~ 'RE93032MFSDI203VE';
WARNING:  Korekta sprzedaży, obrót sprzedawcy 631 różnica -155.50 zł.
UPDATE 1
grzegorz=> SELECT obrot_sprzedawcy FROM sprzedawca WHERE nr_sprzedawcy = 631;
         20100.00

grzegorz=> DELETE FROM sprzedaz WHERE pesel_klienta ~~ '78090726444' AND nr_podwozia ~~ 'RE93032MFSDI203VE';
WARNING:  Anulowanie sprzedaży, obrót sprzedawcy 631 zmniejszony o 200.00 zł,
DELETE 1
grzegorz=> SELECT obrot_sprzedawcy FROM sprzedawca WHERE nr_sprzedawcy = 631;
         19900.00
[/code]

Właśnie dlatego narzekałem o ten klucz podstawowy w sprzedaz, żeby nie robić potem konstrukcji typu powyższego.

Te dodatkowe informacje (poziomy NOTICE i WARNING) służą dla czytelności, ale mogą być także umieszczane w logu pracy serwera (jeśli jest to wymagane, np. tylko poziom WARNING).]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-06-06T16:08:24Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2557#p2557</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2556#p2556"/>
			<content type="html"><![CDATA[Skladnia wydaje mi sie byc ok, a ma ktos pomysl na warunek DELETE?]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-06T15:39:26Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2556#p2556</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2554#p2554"/>
			<content type="html"><![CDATA[Może to Ci pomoże

[url]http://forum.postgresql.org.pl/viewtopic.php?id=21[/url]]]></content>
			<author>
				<name><![CDATA[adamleon]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=873</uri>
			</author>
			<updated>2011-06-06T12:23:44Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2554#p2554</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2553#p2553"/>
			<content type="html"><![CDATA[Witam,

Poczytalem to co napisaliscie i przeanalizowalem wczesniejsze Triggery @gszpetkowski i doszedlem do czegos takiego-jednak nie dziala.

 CREATE FUNCTION obrot_sprzedawcy() RETURNS TRIGGER AS $obrot_sprzedawcy$
    BEGIN
   
    IF (TG_OP = 'DELETE') THEN
          
         ???
         
        
        ELSIF (TG_OP = 'UPDATE') THEN
    
    SET obrot_sprzedawcy = obrot_sprzedawcy + (NEW.cena_finalna - OLD.cena_finalna )
    WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
    RETURN NEW;
    
        ELSIF (TG_OP = 'INSERT') THEN
    
    SET obrot_sprzedawcy = obrot_sprzedawcy + NEW.cena_finalna
    WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;
        RETURN NEW;
        END IF; 
    END;

$obrot_sprzedawcy$ LANGUAGE plpgsql;

CREATE TRIGGER obrot_sprzedawcy
AFTER INSERT OR UPDATE OR DELETE ON sprzedawca
    FOR EACH ROW EXECUTE PROCEDURE obrot_sprzedawcy() ;


1)Nie wiem co wpisac w DELETE?
2)Prosze przeanalizowac ,bo nie wiem czy to na pewno jest dobrze.


Dziekuje i Pozdrawiam,
Patryk]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-06T12:05:54Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2553#p2553</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2551#p2551"/>
			<content type="html"><![CDATA[[code]
CREATE TRIGGER sprzedaz_update
    AFTER UPDATE OR INSERT  OR DELETE ON sprzedaż
[/code]
Logikę funckji możesz uzależnić od operacji która wykonała triggera za pomocą stałej TG_OP, więcej info tutaj
[url]http://www.postgresql.org/docs/9.0/interactive/plpgsql-trigger.html.[/url]]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2011-06-05T13:10:36Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2551#p2551</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2550#p2550"/>
			<content type="html"><![CDATA[Dziala swietnie. Dziekuje... A czy jest mozliwosc zapisania jednego Triggera dla wszystkich funkcji UPDATE,INSTERT DELETE zamiast 3 osobnych? Chodzi mi o swoiste laczenie ich.]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-05T11:33:33Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2550#p2550</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2549#p2549"/>
			<content type="html"><![CDATA[[code]CREATE FUNCTION aktualizuj_obrot_sprzedawcy_update() RETURNS TRIGGER AS $$
BEGIN
    UPDATE sprzedawca
    SET obrot_sprzedawcy = obrot_sprzedawcy + (NEW.cena_finalna - OLD.cena_finalna )
    WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER sprzedaz_update
    AFTER UPDATE ON sprzedaz
    FOR EACH ROW
    EXECUTE PROCEDURE aktualizuj_obrot_sprzedawcy_update();[/code]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-06-02T15:03:02Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2549#p2549</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2548#p2548"/>
			<content type="html"><![CDATA[Cos takiego dla UPDATE?

"


CREATE FUNCTION aktualizuj_obrot_sprzedawcy_update() RETURNS TRIGGER AS $$
BEGIN
    UPDATE sprzedawca
    SET obrot_sprzedawcy = obrot_sprzedawcy + (cena_finalna - NEW.cena_finalna)
    WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER sprzedaz_insert 
    AFTER UPDATE ON sprzedaz
    FOR EACH ROW
    EXECUTE PROCEDURE aktualizuj_obrot_sprzedawcy_update();]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-02T14:27:52Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2548#p2548</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2547#p2547"/>
			<content type="html"><![CDATA[Gdyby to było konieczne, to wystarczy dodać kolejne wyzwalacze na UPDATE i DELETE analogicznie tak jak przy INSERT. Przykładowo jeżeli UPDATE miałby spowodować zmianę cena_finalna dla jakiejś sprzedaży, to w funkcji obsługi trigger'a wystarczy obliczyć różnicę między starą i nową cena_filnalna i zaaktulizować obrot_sprzedawcy.]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-06-02T14:19:11Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2547#p2547</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2546#p2546"/>
			<content type="html"><![CDATA[Bardzo dziekuje, o to wlasnie mi chodzilo. Wszystko dziala poprawnie. A jesli bym chcial przerobic go tak,aby nie byl on typu " and forget" co trzeba zmienic /dodac?

Pozdr.Patryk]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-02T14:09:28Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2546#p2546</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2543#p2543"/>
			<content type="html"><![CDATA[Wygląda na to, że działa, choć nie jestem eskpertem od wyzwalaczy i najlepiej niech ktoś lepiej obeznany mnie skoryguje jeśli trzeba.

DDL:

[code]DROP TABLE IF EXISTS sprzedaz;
DROP TYPE IF EXISTS sposob_zaplaty;
DROP TABLE IF EXISTS sprzedawca;
DROP FUNCTION IF EXISTS aktualizuj_obrot_sprzedawcy();

CREATE TABLE sprzedawca
(
    nr_sprzedawcy smallint PRIMARY KEY,
    imie text,
    nazwisko text NOT NULL,
    obrot_sprzedawcy numeric(11, 2) DEFAULT 0 NOT NULL
);

CREATE TYPE sposob_zaplaty AS ENUM ('Gotowka', 'Karta', 'Przelew', 'Raty');

CREATE TABLE sprzedaz
(
    pesel_klienta char(11), -- REFERENCES klient(pesel)
    nr_podwozia varchar(17), -- REFERENCES samochod(nr_podwozia)
    nr_sprzedawcy smallint REFERENCES sprzedawca(nr_sprzedawcy),
    sposob_zaplaty sposob_zaplaty,
    data_sprzedazy date,
    cena_finalna numeric(9,2) NOT NULL
);[/code]

Utworzenie funkcji oraz wyzwalacza:

[code]CREATE FUNCTION aktualizuj_obrot_sprzedawcy() RETURNS TRIGGER AS $$
BEGIN
    UPDATE sprzedawca
    SET obrot_sprzedawcy = obrot_sprzedawcy + NEW.cena_finalna
    WHERE nr_sprzedawcy = NEW.nr_sprzedawcy;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER sprzedaz_insert 
    AFTER INSERT ON sprzedaz
    FOR EACH ROW
    EXECUTE PROCEDURE aktualizuj_obrot_sprzedawcy();[/code]

DML:

[code]INSERT INTO sprzedawca (nr_sprzedawcy, imie, nazwisko) VALUES
    (231, 'Marek', 'Malczewski'),
    (331, 'Stefan', 'Kowalski'),
    (431, 'Marek', 'Małecki'),
    (531, 'Piotr', 'Wojciechowski'),
    (631, 'Marcin', 'Kowalski'),
    (731, 'Wojtek', 'Nowak'),
    (831, 'Michał', 'Iczewski');

INSERT INTO sprzedaz VALUES
    ('49081109323', 'J3496R0953JH75936', 231, 'Gotowka', '2009-04-21', '41000'),
    ('91052306411', 'DE74930JB83240523', 431, 'Karta', '2009-04-29', '8000'),
    ('91102706512', 'PS86094J3829A3455', 431, 'Przelew', '2009-05-03', '30000'),
    ('91052306411', 'AF749305TG7345920', 631, 'Raty', '2009-06-01', '10000'),
    ('87061105956', 'TR7593YT827364J84', 531, 'Gotowka', '2009-04-12', '21000'),
    ('70012309765', 'DE47294675HG73493', 831, 'Gotowka', '2009-07-05', '23200'),
    ('76091189765', 'FR873432846523H98', 631, 'Karta', '2009-07-25', '9900'),
    ('71011123412', 'WE546278TH6348293', 731, 'Raty', '2009-07-17', '12400'),
    ('57012305645', 'SE647THR673482034', 231, 'Przelew', '2009-08-06', '38000'),
    ('57012306645', 'FDJERI34782475623', 431, 'Przelew', '2009-08-14', '14300'),
    ('54020102345', 'GF3274374HG347248', 731, 'Raty', '2009-10-27', '20400'),
    ('48090720234', 'TU47349JDS8231032', 831, 'Gotowka', '2009-10-22', '19200'),
    ('78090726345', 'RE93032MFSDI20390', 231, 'Karta', '2009-02-07', '11230');[/code]

Wynik:

[code]TABLE sprzedawca;
 nr_sprzedawcy |  imie  |   nazwisko    | obrot_sprzedawcy 
---------------+--------+---------------+------------------
           331 | Stefan | Kowalski      |             0.00
           531 | Piotr  | Wojciechowski |         21000.00
           631 | Marcin | Kowalski      |         19900.00
           431 | Marek  | Małecki       |         52300.00
           731 | Wojtek | Nowak         |         32800.00
           831 | Michał | Iczewski      |         42400.00
           231 | Marek  | Malczewski    |         90230.00
(7 rows)[/code]

Kilka uwag:

[list=*]
[*]sposob_zaplaty IMO prościej potraktować jako typ wyliczeniowy[/*]
[*]obrot_sprzedawcy jako numeric, 11 cyfr znaczących daje przy dwucyfrowej skali maksymalną sumę 999 999 999.99 zł (czyli poniżej 1 mld zł)[/*]
[*]Typ text pamięciowo i wydajnościowo to jest praktycznie to samo, co varchar(n) (vide [url=http://www.depesz.com/index.php/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text/]tutaj[/url]), a jest bezpieczniejszy jeżeli nie ma [b]absolutnej[/b] pewności co do maksymalnej długości[/*]
[*]W sprzedaz brakuje klucza podstawowego, zamiast umieszczania pesel_klienta bezpośrednio może lepiej jest wrzucić id_klienta (1, 2, 3 etc.), analogicznie z nr_podwozia wraz z tabelą samochod[/*]
[*]Ew. pesel (o ile to konieczne) można walidować (np. [url=http://grzegorzdrozd.pl/2011/04/pesel-w-postgresql/]tutaj[/url]), czy też utworzyć dedykowany typ danych[/*]
[*]Naturalnie obrot_sprzedawcy (sprzedawca) nie zaaktualizuje się jeżeli któraś cena_finalna (sprzedaz) z jakichś przeczyn miałaby ulec aktualizacji via UPDATE, podobnie wygląda jeżeli któraś sprzedaż maiałaby zostać anulowana via DELETE post factum. Innymi słowy teraz jest [u]"Insert and forget"[/u][/*]
[/list]]]></content>
			<author>
				<name><![CDATA[gszpetkowski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1223</uri>
			</author>
			<updated>2011-06-02T03:36:17Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2543#p2543</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: [POMOC] Przygotowanie TRIGGERA do projektu. Pilne!]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2542#p2542"/>
			<content type="html"><![CDATA[Dokladnie, dla kazdego sprzedawcy automatycznie powinien dopisac obrot.]]></content>
			<author>
				<name><![CDATA[sali128]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1242</uri>
			</author>
			<updated>2011-06-01T21:29:02Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2542#p2542</id>
		</entry>
</feed>
