[MySQL] Problem z wyzwalaczem.
ssmirnow@gmail.com - 17-06-2007 00:19
[MySQL] Problem z wyzwalaczem.
Cze??,
przygotowa?em procedur?, która update'uje b?d? insertuje tablice `categories_ld`. Problem w tym, ?e procedura musi by? wywo?ywana przez wyzwalacz w momencie update'a w?a?nie na powy?szej tabeli, co z oczywistych wzgl?dów jest nierealne. Przygotowa?em zatem tabelk? 'sygna?ow?' z triggerem odpalaj?cym procedurk? na ON DELETE. tabela `categories_ld` ma wi?c aktualnie nast?puj?ce triggery:
CREATE TRIGGER `new_db`.`categories_ld_bu` BEFORE UPDATE on `new_db`.`categories_ld` FOR EACH ROW BEGIN
insert into localizedlangs_signal values('category',NEW.category_id,NEW.lang_id);
oraz:
CREATE TRIGGER `new_db`.`categories_ld_au` AFTER UPDATE on `new_db`.`categories_ld` FOR EACH ROW BEGIN
delete from localizedlangs_signal where triggertype = 'category' and id = NEW.category_id and lang_id = NEW.lang_id;
co w moim przekonaniu powinno wykona? procedur?.
Niestety:
mysql> update categories_ld set category_name = 'test' where lang_id = 'en' and category_id = 15; ERROR 1442 (HY000): Can't update table 'categories_ld' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Czy kto? z Was spotka? si? z podobnym zachowaniem i zna mo?e jaki? workaround do tego ?
z góry dzi?kuj?.
Pozdrawiam smi.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 17-06-2007 00:19
ssmirnow@gmail.com wrote: > Cze??, > > przygotowa?em procedur?, która update'uje b?d? insertuje tablice > `categories_ld`. > Problem w tym, ?e procedura musi by? wywo?ywana przez wyzwalacz w > momencie update'a w?a?nie na powy?szej tabeli, co z oczywistych > wzgl?dów jest nierealne. Przygotowa?em zatem tabelk? 'sygna?ow?' z > triggerem odpalaj?cym procedurk? na ON DELETE. > tabela `categories_ld` ma wi?c aktualnie nast?puj?ce triggery: > > CREATE TRIGGER `new_db`.`categories_ld_bu` BEFORE UPDATE on > `new_db`.`categories_ld` > FOR EACH ROW BEGIN > > insert into localizedlangs_signal > values('category',NEW.category_id,NEW.lang_id); > > oraz: > > CREATE TRIGGER `new_db`.`categories_ld_au` AFTER UPDATE on > `new_db`.`categories_ld` > FOR EACH ROW BEGIN > > delete from localizedlangs_signal where triggertype = 'category' and > id = NEW.category_id and lang_id = NEW.lang_id; > > co w moim przekonaniu powinno wykona? procedur?. > > Niestety: > > mysql> update categories_ld set category_name = 'test' where lang_id = > 'en' and category_id = 15; > ERROR 1442 (HY000): Can't update table 'categories_ld' in stored > function/trigger because it is already used by statement which invoked > this stored function/trigger. > > > Czy kto? z Was spotka? si? z podobnym zachowaniem i zna mo?e jaki? > workaround do tego ?
A nie masz przypadkiem triggera na tabeli localizedlangs_signal?
-- P.M.
ssmirnow@gmail.com - 17-06-2007 00:19
On 14 Cze, 13:34, Pawe? Matejski <m...@spam.madej.pl.eu.org> wrote: > ssmir...@gmail.com wrote: > > Cze??, > > > przygotowa?em procedur?, która update'uje b?d? insertuje tablice > > `categories_ld`. > > Problem w tym, ?e procedura musi by? wywo?ywana przez wyzwalacz w > > momencie update'a w?a?nie na powy?szej tabeli, co z oczywistych > > wzgl?dów jest nierealne. Przygotowa?em zatem tabelk? 'sygna?ow?' z > > triggerem odpalaj?cym procedurk? na ON DELETE. [...]
> A nie masz przypadkiem triggera na tabeli localizedlangs_signal? >
Mam. Przy usuwaniu danych wywo?uje procedur? modyfikuj?c? zawarto?? categories_ld. S?dzi?em, ?e umiesczenie odwo?ania do procedury w osobnej tablicy ustrze?e mnie przed zablokowaniem wywolania procedury. Jest wobec tego jaki? inny sposób na osi?gni?cie po??danego przeze mnie celu tj. podczas update'a wybranych rekordów w categories_ld ma tak?e zupdate'owa? rekordy "podrz?dne" w tej samej tablicy. Przyk?adowo update category_name dla lang_id = 'en' musi te? wymusi? update tego pola dla j?zyka 'us'. Ca?o?c wykonuj? procedur?, przym problemem jest zautomatyzowane (via trigger) jej wywo?anie.
Pozdrawiam smi.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 17-06-2007 00:19
ssmirnow@gmail.com wrote: > On 14 Cze, 13:34, Pawe? Matejski <m...@spam.madej.pl.eu.org> wrote: >> ssmir...@gmail.com wrote: >>> Cze??, >>> przygotowa?em procedur?, która update'uje b?d? insertuje tablice >>> `categories_ld`. >>> Problem w tym, ?e procedura musi by? wywo?ywana przez wyzwalacz w >>> momencie update'a w?a?nie na powy?szej tabeli, co z oczywistych >>> wzgl?dów jest nierealne. Przygotowa?em zatem tabelk? 'sygna?ow?' z >>> triggerem odpalaj?cym procedurk? na ON DELETE. > [...] > >> A nie masz przypadkiem triggera na tabeli localizedlangs_signal? >> > > Mam. Przy usuwaniu danych wywo?uje procedur? modyfikuj?c? > zawarto?? categories_ld. S?dzi?em, ?e umiesczenie odwo?ania > do procedury w osobnej tablicy ustrze?e mnie przed zablokowaniem > wywolania procedury. > Jest wobec tego jaki? inny sposób na osi?gni?cie po??danego przeze > mnie celu tj. podczas update'a wybranych rekordów w categories_ld > ma tak?e zupdate'owa? rekordy "podrz?dne" w tej samej tablicy. > Przyk?adowo update category_name dla lang_id = 'en' musi te? > wymusi? update tego pola dla j?zyka 'us'. Ca?o?c wykonuj? procedur?, > przym problemem jest zautomatyzowane (via trigger) jej wywo?anie.
Po prostu si? nie da i ju?. Zrób procedur?, za pomoc? której b?dziesz dokonywa? zmian na tej tablicy i nie rób bezpo?rednich insertów i updatów.
Albo przejd? na postgresa, on nie ma takich ogranicze?. :)
-- P.M.
ssmirnow@gmail.com - 17-06-2007 00:19
On 14 Cze, 15:49, Pawe? Matejski <m...@spam.madej.pl.eu.org> wrote:
[...]
> > Po prostu si? nie da i ju?. Zrób procedur?, za pomoc? której b?dziesz dokonywa? > zmian na tej tablicy i nie rób bezpo?rednich insertów i updatów. > > Albo przejd? na postgresa, on nie ma takich ogranicze?. :) >
Haha,
jakbym tylko móg?... utar?o si? juz, ?e gdy mówie o "kolejnej_rzeczy_której_nie_da_si?_zrobi?_na_mysql " pada zdanie: "wiesz, mysql to nie oracle... to nawet nie postgres" :P
Tak czy inaczej - dzi?ki za pomoc.
smi.
=?ISO-8859-2?Q?Pawe=B3_Matejski?= - 17-06-2007 00:19
ssmirnow@gmail.com wrote: > On 14 Cze, 15:49, Pawe? Matejski <m...@spam.madej.pl.eu.org> wrote: > > Haha, > > jakbym tylko móg?... > utar?o si? juz, ?e gdy mówie o > "kolejnej_rzeczy_której_nie_da_si?_zrobi?_na_mysql " pada > zdanie: "wiesz, mysql to nie oracle... to nawet nie postgres" :P
Akurat ten sam problem z tego co pami?tam by?o nawet w oracle, przynajmniej w starszych wersjach. :)
-- P.M.
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
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 |
|