Parent tabela prikazuje podatke svih tabela koje su je nasledile. Pošto je red pomoću trigera upisan u child tabelu (INSERT INTO child ...) taj red će biti vidljiv i u parent tabeli. Red nije upisan u parent tabelu jer to sprečava deo trigera RETURN NULL!
Kreirajmo strukturu iz predhodnog posta i proverimo da li su tabele prazne
Code:
karas=# SELECT * FROM parent;
id | message
----+---------
(0 rows)
karas=# SELECT * FROM child;
id | message
----+---------
(0 rows)
Tabele jesu prazne. Sada unesemo nešto u child tabelu
Code:
karas=# INSERT INTO parent (message) VALUES ('Hello!');
INSERT 0 0
karas=# INSERT INTO parent (message) VALUES ('HELLO!');
INSERT 0 0
Proverimo rezultat:
Code:
karas=# SELECT * FROM parent;
id | message
----+---------
1 | Hello!
2 | HELLO!
(2 rows)
karas=# SELECT * FROM child;
id | message
----+---------
1 | Hello!
2 | HELLO!
(2 rows)
To je to što očekujemo. Tako se ponaša particionisanje.
Da bi se izvršilo brisanje dovoljno je obrisati podatke samo iz child tabele. Da li je to dovoljan dokaz da se podaci ne upisuju i u parent tabelu?
Code:
karas=# DELETE FROM child;
DELETE 2
karas=# SELECT * FROM parent;
id | message
----+---------
(0 rows)
karas=# SELECT * FROM child;
id | message
----+---------
(0 rows)
=========================================
Kada bi se u trigeru umesto RETURN NULL koristilo RETURN NEW, tada bi smo imali upis i u child i u parent tabelu.
Pošto sam pobrisao podatke, treba samo da promenim triger.
Code:
CREATE OR REPLACE FUNCTION f_bi_par () RETURNS trigger AS
$body$
BEGIN
-- uslov particionisanja
IF NEW.id>=1 AND NEW.id <= 100 THEN
INSERT INTO child VALUES(NEW.id, NEW.message);
END IF;
-- SADA CE SE ZBOG NEW UPISIVATI I U PARENT TABELU!
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
DROP TRIGGER tr_bi_par ON parent;
CREATE TRIGGER tr_bi_par BEFORE INSERT
ON parent FOR EACH ROW
EXECUTE PROCEDURE f_bi_par();
Ako sada izvršimo upis dva podatka dobićemo duplirane podatke u parent tabeli jer ona sada prikazuje i podatke koji su upisani u njoj i podatke koji su upisani u njenoj tabeli naslednici.
Code:
karas=# INSERT INTO parent (message) VALUES ('Zdravo!');
INSERT 0 0
karas=# INSERT INTO parent (message) VALUES ('ZDRAVO!');
INSERT 0 0
karas=# SELECT * FROM parent;
id | message
----+---------
3 | Zdravo!
4 | ZDRAVO!
3 | Zdravo!
4 | ZDRAVO!
(4 rows)
karas=# SELECT * FROM child;
id | message
----+---------
3 | Zdravo!
4 | ZDRAVO!
(2 rows)
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo