🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #194396

Re: ORACLE - jak sprawdzić, gdzie jest zmieniana wartość?

#194396
From: Piotr M Kuć
Date: Mon, 30 Mar 2015 13:50
46 lines
3446 bytes
W artykule <bd3d62f4-32c8-4500-af40-3c2aeee9fb99@googlegroups.com> goo-mlyny@ciach.net napisal(a):

> Mam taki prosty trigger:
> CREATE OR REPLACE TRIGGER AC_TG_POTW_EDI
> BEFORE INSERT
> ON ZAMOWIENIA_KLIENTOW 
> REFERENCING NEW AS New OLD AS Old
> FOR EACH ROW
> DECLARE
>   nowa_data date;
> BEGIN
>   if :new.KOD_RODZAJU_ZAMOWIENIA='EDI' then
>    :new.POTWIERDZENIE_ZAMOWIENIA:='T';
>     nowa_data := sysdate;
>    :new.DATA_WYDANIA := to_date(nowa_data);
>     --:new.DATA_WYDANIA := nowa_data; --tak też próbowałem, bo już kombinuję, jak koń...
>    :new.KOMENTARZ_NA_ZLECENIU:='Data wyd.: ' || TO_CHAR(nowa_data) || ' [-] ' || TO_CHAR(:new.DATA_WYDANIA);
>   end if;
> END AC_TG_POTW_EDI;
> /
>
> Pole DATA_WYDANIA jest typu date.
> I po wprowadzeniu danych - w polu POTWIERDZENIE_ZAMOWIENIA mam T,
> w polu KOMENTARZ_NA_ZLECENIU - mam 2x datę. 
> Niestety - w polu DATA_WYDANIA na końcu - czyli jak zrobię select * from ZAMOWIENIA_KLIENTOW - mam null.
> Tak się domyślam, że może być jeszcze jakiś inny trigger, który wykonuje się później, niż mój - i zeruje ustawioną wartość. Ale nie wiem, jak namierzyć miejsce, gdzie to się dzieje. Cała struktura bazy, tabele, triggery - nie są moje, jest ich naprawdę mnóstwo - i nie mogę póki co znaleźć miejsca, gdzie następuje zmiana.

W narzędziach typu PL/SQL Developer, Toad, itp., masz drzewko z hierarchią obiektów.
Klikasz na tabelce i rozwijasz listę wyzwalaczy na niej, a potem przeglądasz każdy
aż znajdziesz winowajcę. Ewentualnie możesz to sobie ręcznie sprawdzić:
select * from user_triggers t where t.table_name = 'ZAMOWIENIA_KLIENTOW';
select * from user_source s where s.name = 'TRG_BLA_BLA_BLA' order by s.name, s.line;

Jak łączysz się przez inny schemat niż ten sprawdzany to będziesz potrzebował
widoków systemowych dba_triggers/all_triggers, dba_source/all_source.

A tak na marginesie robienie TO_DATE na zmiennej typu DATE jest bez sensu.
Do TO_CHAR zawsze podawaj format, bo inaczej polegasz na bieżących w sesji.
Co jest raczej ryzykowne, zwłaszcza jak odpalasz coś z palucha, z crona, itp.
Np. TO_CHAR(nowa_data,'dd-mm-yyyy hh24:mi:ss')



-- 
Pozdrawiam,                           Piotr.Kuc-(szympans)-kuciak.net
Piotr M Kuć
Technical Details
Message-ID: <slrn.pl.mhil51.jfc.kuciak@PiotrMarianKuc>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!newsfeed.fsmpi.rwth-aachen.de!newsfeed.straub-nv.de!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail
References: <bd3d62f4-32c8-4500-af40-3c2aeee9fb99@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!newsfeed.fsmpi.rwth-aachen.de!newsfeed.straub-nv.de!eternal-september.org!feeder.eternal-september.org!mx02.eternal-september.org!.POSTED!not-for-mail
From: Piotr M Kuć <kuciak@nospam.invalid>
Newsgroups: pl.comp.bazy-danych
Subject: Re: ORACLE - jak sprawdzić, gdzie jest zmieniana
 wartość?
Date: Mon, 30 Mar 2015 13:50:43 +0000 (UTC)
Organization: I Love Slrn-pl
Lines: 46
Message-ID: <slrn.pl.mhil51.jfc.kuciak@PiotrMarianKuc>
References: <bd3d62f4-32c8-4500-af40-3c2aeee9fb99@googlegroups.com>
Mime-Version: 1.0
Injection-Date: Mon, 30 Mar 2015 13:50:43 +0000 (UTC)
Injection-Info: mx02.eternal-september.org; posting-host="c3cf5c369de1862e6b8732582514b3ce"; logging-data="6067"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+Pc5DUJEKZo/F5QwWhdw3V"
User-Agent: slrn/0.9.8.1 (pl-1.6.0w) (Windows (i686)) Hamster/2.0.6.0
Cancel-Lock: sha1:0c/pK/XqhlzbzAs2VbLSuecxads=
X-Licznik: 8255
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit