Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> bardziej złożona reguła, utworzenie reguły dla INSERT, poprawnie modyfikującą dane tabel wchodz
vallerius
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 2.03.2006
Skąd: Oświęcim

Ostrzeżenie: (0%)
-----


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.


--------------------
vlrs
vallerius@konarski.edu.pl
Co to jest problem?
-To zjawisko, które wprawia umysł w zakłopotanie.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 09:52