Temat: Partycje na regułach i zwracana wartość po insert
Więc jest sobie tabela nadrzędna z pozycjami dokumentów np:
CREATE TABLE magazyn_inout_pos_parent
(
doc_id character varying(25) NOT NULL, -- Referencja do dokumentu
doc_pos integer NOT NULL,
quantity numeric(12,2) NOT NULL,
product_id integer NOT NULL,
unit_price numeric(12,2) NOT NULL, -- cena za 1 unit
mc_id character varying(12) NOT NULL, -- referencja do otwartego miesiąca
CONSTRAINT magazyn_inout_pos_parent_pkey PRIMARY KEY (doc_id, doc_pos)
)
i tabela z miesiącami :
CREATE TABLE miesiace_mag
(
id character varying(12) NOT NULL,
miesiac integer,
rok integer,
mag_id integer NOT NULL, -- FK do magazynu
data date NOT NULL DEFAULT now(), -- Data która przez trigger zostanie podzielona na miesiąc i rok
CONSTRAINT "PK_miesiace" PRIMARY KEY (id),
CONSTRAINT "FK_miesiace_mag_id" FOREIGN KEY (mag_id)
REFERENCES magazyny (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
Na której wyzwalany jest trigger tworzący partycje
CREATE TRIGGER utworz_partycje
AFTER INSERT OR UPDATE OR DELETE
ON miesiace_mag
FOR EACH ROW
EXECUTE PROCEDURE magmc_modyfikator();
Procedura magmc w zależności czy insert, update czy delete coś tam robi ale w każdym razie podczas insert wywołuje :
CREATE OR REPLACE FUNCTION create_mag_pos(mcid character varying, magnr integer)
RETURNS boolean AS
$BODY$DECLARE
tname text:='magazyny.magazyn_inout_' || magnr;
suffix text:='_doc';
pname text:='magazyny.magazyn_inout_pos_' || mcid;
BEGIN
EXECUTE 'CREATE TABLE ' || pname || ' (CHECK (mc_id=''' || mcid || ''')) INHERITS (magazyn_inout_pos_parent);';
EXECUTE 'CREATE RULE magazyn_inout_pos_' || mcid || '_insert_rule AS ON INSERT to magazyn_inout_pos_parent WHERE (mc_id=''' || mcid || ''' ) DO INSTEAD INSERT INTO ' || pname || ' VALUES (NEW.*);';
EXECUTE 'ALTER TABLE '||pname||' ADD CONSTRAINT "PK_'||pname||'" PRIMARY KEY ("doc_id", "doc_pos");';
EXECUTE 'ALTER TABLE '|| pname ||' ADD CONSTRAINT "FK_'||pname||'_docid" FOREIGN KEY (doc_id) REFERENCES '||tname||' (id) ON UPDATE NO ACTION ON DELETE NO ACTION;';
EXECUTE 'ALTER TABLE '|| pname ||' ADD CONSTRAINT "FK_'||pname||'_mcid" FOREIGN KEY (mc_id) REFERENCES miesiace_mag (id) ON UPDATE NO ACTION ON DELETE NO ACTION;';
EXECUTE 'ALTER TABLE '|| pname ||' ADD CONSTRAINT "FK_'||pname||'_prodid" FOREIGN KEY (product_id) REFERENCES products (id) ON UPDATE NO ACTION ON DELETE NO ACTION;';
RETURN TRUE;
END;
W tym wszystkim chodzi o to, żeby partycje i reguły były tworzone automatycznie podczas modyfikacji tabel i to działa. Problem pojawia się natomiast podczas wpisywania danych do tabeli kiedy potrzebuję zwrócić klucz łączony (doc_id, doc_pos);
Niestety INSERTY tworzone w regułach z clauzurą WHERE pozbawione są możliwości zwracania wartości w posgresql-u.
Klucz ten jest też tworzony wg. dość skomplikowanych funkcji i raczej nie interesuje mnie jego zamiana na sekwencje a następnie wybieranie tej wartości funkcjami curentval itp.
Czy istnieje jakiś elegancki sposób tworzenia partycji i pracy na zwracanych po insert wartościach.
Dajcie znać proszę jeśli macie na to jakiś sprytny sposób.
Ostatnio edytowany przez risc (2013-07-03 16:56:00)