trigger i sprawdzanie unikalnosci
PeBe - 04-01-2006 09:32
trigger i sprawdzanie unikalnosci
Witam Mam problem z napisaniem wyzwalacza w pl/sql-u before insert or update, ktory sprawdza czy wstawiana wartosc jest unikalna. Utworzylem kursor, ktory zlicza identyczne rekordy - jesli w wyniku otrzymam jakis wiersz to chcialem wyrzucic wyjatek, jesli go nie znajdzie to jest ok. Jednak to nie dziala - prawdopodobnie dlatego, ze w wyzwalaczu nie moge uzywac select na tabeli do ktora aktualizuje/wstawiam. Czy jest z tego jakies wyjscie? Nie chodzi mi tutaj konkretnie o ten problem, bo moge go obejsc inaczej, ale w jaki sposob wybrac selectem jakies wiersze z tej tabeli? Dzieki z gory za pomoc. Pozdrawiam
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 04-01-2006 09:32
Dnia Tue, 03 Jan 2006 18:19:22 +0100, PeBe <pebe@op.pl> wklepał(-a):
>Witam >Mam problem z napisaniem wyzwalacza w pl/sql-u before insert or update, >ktory sprawdza czy wstawiana wartosc jest unikalna. Utworzylem kursor, >ktory zlicza identyczne rekordy - jesli w wyniku otrzymam jakis wiersz >to chcialem wyrzucic wyjatek, jesli go nie znajdzie to jest ok. Jednak >to nie dziala - prawdopodobnie dlatego, ze w wyzwalaczu nie moge uzywac >select na tabeli do ktora aktualizuje/wstawiam. Czy jest z tego jakies >wyjscie? Nie chodzi mi tutaj konkretnie o ten problem, bo moge go obejsc > inaczej, ale w jaki sposob wybrac selectem jakies wiersze z tej tabeli?
Po 1. - FAQ. Po 2. - możesz użyć procedury z transakcją autonomiczną. Ale to i tak ci nic nie da, bo nie będzie ona widzieć rekordów wstawianych przez inne sesje.
Zrób po prostu klucz unikalny. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
Krzysztof Wiśniewski - 04-01-2006 09:32
Użytkownik "Sławomir Szyszło" <slaszysz@poczta.onet.pl> napisał w wiadomości news:dpegeh.1ag.1@slaszysz.poczta.onet.pl... | Dnia Tue, 03 Jan 2006 18:19:22 +0100, PeBe <pebe@op.pl> wklepał(-a): | | >Witam | >Mam problem z napisaniem wyzwalacza w pl/sql-u before insert or update, | >ktory sprawdza czy wstawiana wartosc jest unikalna. Utworzylem kursor, | >ktory zlicza identyczne rekordy - jesli w wyniku otrzymam jakis wiersz | >to chcialem wyrzucic wyjatek, jesli go nie znajdzie to jest ok. Jednak | >to nie dziala - prawdopodobnie dlatego, ze w wyzwalaczu nie moge uzywac | >select na tabeli do ktora aktualizuje/wstawiam. Czy jest z tego jakies | >wyjscie? Nie chodzi mi tutaj konkretnie o ten problem, bo moge go obejsc | > inaczej, ale w jaki sposob wybrac selectem jakies wiersze z tej tabeli? |
Bo tworzysz wyzwalacz nie taki, jak trzeba. :)
CREATE TRIGGER tgr_tabela ON dbo.tabeka FOR INSERT AS BEGIN SET NOCOUNT ON /*Czy wstawiono niedozwoloną wartość: */ IF EXISTS ( SELECT dbo.tabela.ID FROM dbo.tabela INNER JOIN inserted ON inserted.unikalne_pole = dbo.tabela.unikalne_pole WHERE dbo.tabela.ID != inserted.ID ) BEGIN RAISERROR (Nie da rady! To pole ma być unikalne!', 13 , 1) ROLLBACK TRANSACTION RETURN END
Ale pamiętaj - ma to sens, jeśli wstawiono pojedynczy rekord. Dla operacji na większej liczbie rekordów musisz oprogramować mądrzejsze rozwiązanie.
| Zrób po prostu klucz unikalny.
To chyba najrozsądniejsze i najmniej pracochłonne rozwiązanie.
Pozdrawiam, Krzysiek
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 04-01-2006 09:33
Dnia Tue, 3 Jan 2006 19:12:00 +0100, "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> wklepał(-a):
>Bo tworzysz wyzwalacz nie taki, jak trzeba. :)
(...)
A po jakiemu ten trigger? :)
P.S. PeBe - pisz o jaką bazę chodzi. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[pgsql] Wykonanie triggera po =?ISO-8859-2?Q?zako=F1czeniu_tra?==?ISO-8859-2?Q?nsakcji?=
=?ISO-8859-2?Q?Mam_do_napisania_triggera_plpgsq?= =?ISO-8859-2?Q?l_mo=BFe_kto=B6_b=EAdzie_w_stanie_pom_?=
[pgsql] Zmienna jako pole NEW w trigger pl/pgSQL.
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
=?ISO-8859-2?Q?[Oralce]_Jak_sprawdzi=E6_d?= =?ISO-8859-2?Q?ok=B3adn=B1_wersj=EA_binari=F3w=3F?=
[MSSQL] Wykonanie DTS za =?ISO-8859-2?Q?pomoc=B1_triggera?=
=?iso-8859-2?q?firebird_i_triggery_-_logowanie_historii_zmian_zawarto=B6ci?=
=?iso-8859-2?q?Jak_wykona=E6_rekompilacj=EA_procedury/triggera?=
Postgresql - gdzie moge sie nauczyc pisania funkcji i triggerow w
Funkcja replace w triggerach MS SQL Server 2005
zanotowane.pldoc.pisz.plpdf.pisz.plkfia-tek.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|