Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Trigger oracle nie działa przy insert

almurik 08 Paź 2012 22:10 1251 6
  • #1 08 Paź 2012 22:10
    almurik
    Poziom 9  

    Witam. Mam problem z wyzwalaczem. Tabela infpunkt zawiera dane adresowe, a raczej id do słowników z miastami ulicami ...
    Chcę aby pole infpunkt_nazwa uzupełniało się następującymi danymi: miasto,ulica.numer.

    Trigger niestety działa ale tylko dla update. Dla insert nie. Jakieś rady ?

    Kod: sql
    Zaloguj się, aby zobaczyć kod

    0 6
  • #3 09 Paź 2012 20:27
    almurik
    Poziom 9  

    Przy insert nie podmienia wartości na 'adres'
    przy update podmienia wartość na 'adres'

    Jeżeli zamienię
    IF adres<>Nvl(:NEW.infpunkt_nazwa,'x') THEN :NEW.infpunkt_nazwa:=adres; END IF;

    na np:

    :NEW.infpunkt_nazwa:='kotek';

    to podczas insert 'kotek' też nie wskakuje :) do bazy. Dopiero wycięcie całego select'a

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    wrzuca 'kotka' do bazy podczas insertu. Czyli coś z tym selectem nie tak (no tylko że dla update działa)

    0
  • #4 09 Paź 2012 21:14
    gaskoin
    Poziom 38  

    Problem jest tego typu:

    Trigger działa BEFORE INSERT, tzn, że danych, które wkładasz do tabeli jeszcze w niej nie ma. Ja widzę , że w WHERE jest odwołanie do id z nowych wartości (których nie ma :) ). Generalnie robienie selectów w triggerze nie jest najlepszym pomysłem.

    0
  • #6 09 Paź 2012 22:51
    almurik
    Poziom 9  

    hmmm
    przykład. Bardzo podobny trigger befor insert który działa na tej samej tabeli wyśmienicie

    Kod: sql
    Zaloguj się, aby zobaczyć kod


    gdyby było jak piszecie to warunek IF :NEW.infpunkttyp_id <> 41 w ogóle by się nie wykonał, ponieważ NEW.infpunkttyp_id też nie istnieje - a wykonuje się.

    Fakt faktem w tym przypadku where selekta odnosi się już do istniejących rekordów ale co z tym if ?

    edit: ok po namyśle zaczynam rozumieć o co chodzi. Trzeba przerobić to po prostu na after :). Dziękuję za pomoc.

    0