Mam za zadanie do zrobienia Widok modyfikowalny i jestem na poziomie tworzenia odpowiednich reguł
Sprawa przedstawia się tak:
Mam bazę ksiażek, a w niej 3 tabele:
- ksiazki(id, id_autora, id_wydawnictwa)
- autorzy (id, imie, nazwisko)
- wydawnictwa(id, nazwa)
CREATE OR REPLACE VIEW ksiazki_full AS SELECT a.imie, a.nazwisko, ks.tytul, w.nazwa AS wydawnictwo FROM autorzy a, ksiazki ks, wydawnictwa w WHERE ks.id_autora = a.id AND ks.id_wydawnictwa = w.id;
Dla tego widoku trzeba stworzyc regułe ON INSERT i tak:
a. jeżli imie i nazwisko juz istnieja w tabeli autorzy to dodac id_autora w tabeli ksiazki na odpowienia do istniejacego autora
b. jezeli nie istnieje taki autor to dodac tego autora do tabeli autorzy i id nowego autora dodac do tabeli ksiazki
Tak samo z tabela wydawnictwa
Nie mając zbyt szerokiego pojecia o regulach, w ciemno probowalem napisac kod wzorujac sie na tworzeniu procedur:
CREATE OR REPLACE RULE wrzuc AS ON INSERT TO ksiazki_full DO INSTEAD ( DECLARE VARIABLE id_autora_ = (SELECT id FROM autorzy WHERE imie=new.imie AND nazwisko=new.nazwisko) INTEGER; DECLARE VARIABLE id_wydawnictwa_ = (SELECT id FROM wydawnictwa WHERE nazwa = new.wydawnictwo) INTEGER; IF(id_autora_ == NULL) THEN BEGIN INSERT INTO autorzy (imie, nazwisko) VALUES (new.imie, new.nazwisko); id_autora_ = (SELECT MAX(id) FROM autorzy); END IF(id_wydawnictwa_ == NULL) THEN BEGIN INSERT INTO wydawnictwa (nazwa) VALUES (new.wydawnictwo); id_wydawnictwa_ = (SELECT MAX(id) FROM wydawnictwa); END INSERT INTO ksiazki (id_autora, id_wydawnictwa, tytul) VALUES ( id_autora_, id_wydawnictwa_ , new.tytul); );
A może rozwiązać to w inny sposób, np w regule po prostu dać
INSERT INTO INTO autorzy(imie, nazwisko) VALUES (new.imie, new.nazwisko);
a w tabeli autorzy przed INSERTem wywołać procedure sprawdzającą czy dany autor jest już w tabeli.
Nie wiem czy w dobrym kierunku idę, więc proszę o pomoc w poprawnym utworzeniu tejże reguły.