Baza danych SQL

0

Witajcie, mam pewien problem z triggerem. Mam dwie tabele. W jednym z nich znajduje się "całościowa" ilość przedmiotów a w drugiej ilość przedmiotów danego typu. Chciałbym żeby trigger działał wtedy kiedy użyjemy insert into na 1 tabeli przez co dodał by on ilość przedmiotu danego typu do ilości wszystkich przedmiotów. Naskrobałem coś takiego:

CREATE OR REPLACE TRIGGER T_DODAJ_ILOSC
AFTER INSERT ON SKLEPA
FOR EACH ROW
BEGIN
     update WSZYSTKIE_PRZEDMIOTY SET ILE_WSZYSTKICH_PRZEDMIOTOW =ILE_WSZYSTKICH_PRZEDMIOTOW + SKLEPA.ILOSCP  WHERE ID_ILE_WSZYSTKICH_PRZEDMIOTOW = 1;
   END;
/

niestety ale takie coś nie działa, wywala błąd : invalid identifier

0
UPDATE WSZYSTKIE_PRZEDMIOTY SET ILE_WSZYSTKICH_PRZEDMIOTOW =ILE_WSZYSTKICH_PRZEDMIOTOW + NEW.ILOSCP  WHERE ID_ILE_WSZYSTKICH_PRZEDMIOTOW = 1;
0
Marcin.Miga napisał(a):
UPDATE WSZYSTKIE_PRZEDMIOTY SET ILE_WSZYSTKICH_PRZEDMIOTOW =ILE_WSZYSTKICH_PRZEDMIOTOW + NEW.ILOSCP  WHERE ID_ILE_WSZYSTKICH_PRZEDMIOTOW = 1;

'

próbowałem i błąd ten sam: invalid identifier

0
Sadam2 napisał(a):

Przeczytaj wątek http://4programmers.net/Forum/Bazy_danych/252660-sqlce-_update_zpodzapytaniem-_jak_zrobic.

Na podstawie tego napisałem coś takiego:

CREATE OR REPLACE TRIGGER T_DODAJ_ILOSC
AFTER INSERT ON SKLEPA
FOR EACH ROW
BEGIN
     update RODZAJ_PRZEDMIOTOW SET ILE_WSZYSTKICH_PRZEDMIOTOW = (SELECT ILOSCP  FROM SKLEPA) + ILE_WSZYSTKICH_PRZEDMIOTOW WHERE ID_ILE_WSZYSTKICH_PRZEDMIOTOW = 1;
   END;
/

Trigger się skompilował jednak teraz przy insertowaniu:

INSERT INTO SKLEPA(id, ILOSCP)
  Values ('1', '2');

wywala błąd:

  1. 00000 - "table %s.%s is mutating, trigger/function may not see it"
    Cause: A trigger (or a user defined plsql function that is referenced in
    this statement) attempted to look at (or modify) a table that was
    in the middle of being modified by the statement which fired it.
    Action: Rewrite the trigger (or function) so it does not read that table.
0

Cześć,
Trigger jest częścią transakcji która go wywołuje.To znaczy, że tabela którą chcesz zmodyfikować, w momencie w którym chcesz to zrobić, jest niemodyfikowalna ze względu na poziomy izolacji.

To powoduje błąd:

SELECT ILOSCP  FROM SKLEPA

W SQL SERVER masz takie tabele jak inserted automatycznie dostepne w obrębie triggera.Wydaje mi się, że Ty szukasz tabeli ":new".Zastąp powyższy kod z wartością kolumny z tej tabeli :new. Jak chcesz daj sqlfiddle to Ci to napiszę.

Pozdrawiam

0
Mikajlo8 napisał(a):

Cześć,
Trigger jest częścią transakcji która go wywołuje.To znaczy, że tabela którą chcesz zmodyfikować, w momencie w którym chcesz to zrobić, jest niemodyfikowalna ze względu na poziomy izolacji.

To powoduje błąd:

SELECT ILOSCP  FROM SKLEPA

W SQL SERVER masz takie tabele jak inserted automatycznie dostepne w obrębie triggera.Wydaje mi się, że Ty szukasz tabeli ":new".Zastąp powyższy kod z wartością kolumny z tej tabeli :new. Jak chcesz daj sqlfiddle to Ci to napiszę.

Pozdrawiam

Jakbyś mógł, byłbym mega wdzięczny :)

http://sqlfiddle.com/#!4/be82c 

Mam nadzieje, że dobrze to zrobiłem

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0