Witam!
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)
do tego jest utworzony widok:

  1. CREATE OR REPLACE VIEW ksiazki_full AS SELECT a.imie, a.nazwisko, ks.tytul, w.nazwa AS wydawnictwo
  2. FROM autorzy a, ksiazki ks, wydawnictwa w
  3. 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:
  1. CREATE OR REPLACE RULE wrzuc AS ON INSERT TO ksiazki_full
  2. DO INSTEAD
  3. (
  4.  
  5. DECLARE VARIABLE id_autora_ = (SELECT id FROM autorzy WHERE imie=new.imie AND nazwisko=new.nazwisko) INTEGER;
  6. DECLARE VARIABLE id_wydawnictwa_ = (SELECT id FROM wydawnictwa WHERE nazwa = new.wydawnictwo) INTEGER;
  7. IF(id_autora_ == NULL)
  8. THEN
  9. BEGIN INSERT INTO autorzy (imie, nazwisko)
  10. VALUES (new.imie, new.nazwisko);
  11. id_autora_ = (SELECT MAX(id) FROM autorzy); END
  12. IF(id_wydawnictwa_ == NULL)
  13. THEN
  14. BEGIN INSERT INTO wydawnictwa (nazwa)
  15. VALUES (new.wydawnictwo);
  16. id_wydawnictwa_ = (SELECT MAX(id) FROM wydawnictwa); END
  17.  
  18. INSERT INTO ksiazki (id_autora, id_wydawnictwa, tytul)
  19. VALUES ( id_autora_, id_wydawnictwa_ , new.tytul);
  20. );

A może rozwiązać to w inny sposób, np w regule po prostu dać
  1. INSERT INTO INTO autorzy(imie, nazwisko)
  2. 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.