Turecky Posted May 26, 2011 Report Share Posted May 26, 2011 Sveiki. Esmu izmeklējies un neatradu pagaidām savai problēmai risinājumu.Lieta sekojoša. Nepieciešams ar trigera palīdzību sarakstīt audita tabulā izmainītās vērtībās. Pa zemnieku modei jau māku, bet gribēju zināt vai nav iespējams to visu izdarīt civilizēti! Pa zemnieku modei ir, kad katram laukam rakstam IF new<>old pārbaudi. Viss jau būtu jauki un skaisti, tik ja tabulā ir vairāki lauki neliekas loģiski tādā veidā to darīt. Doma ir tāda, ka vajadzētu, lai trigeris startējoties paskatās pats tabulas kolonnas nosaukumus un no šī saraksta tad skatās visus laukus, t.i. Doma trigerim apmēram šāda: @1 = tabula @2 = datubāze (lai izslēgtu, ka kādā no db ir tāda pati tabula) @offset = 1; //nav nepieciešamības pārbaudīt vai tiek updeitots ID lauks @rows_in_table = (selecktējasm count(column_name)no info shēmas colonu tabulu, kur table_name = @1 un table_schema = @2) //iegūstam colonu skaitu tad ar while ciklu while @offset < @rows_in_table do @last = selektējam column_name no info shēmas colonu tabulu, kur table_name = @1 un table_schema = @2 limits 1 offets @offset(lūpā tas palielinās un selekts atgriež pa vienam laukam katrā piegāienā) if new.@last <> old.@last then insertējam audita tabulā (tabulas_nosaukums,tabulas_lauks,vecā_vērtība,jaunā_vērtība); end if; @offset = @offset + 1; end while; Domā kā jau sākumā minēju, lai nebūtu jāraksta piemēram 32 reizes parastais IF new<>old tad šāda shēma itkā to darītu automātiski. Mēģināju, bet laikam nepareizi sintaksi rakstu. Varbūt kāds guru var palīdzēt, ja vispār tas iespējams uz MySQL un nav baisais noslēpums. Domāju, ka kādam vēl tas varētu interesēt. Ceru uz atsaucību. Paldies! P.S. Manuāļus var nepiedāvāt, drīzāk ceru uz piemēru, ja nu kādam guru atrodas dažas minūtes šim nelielajam uzdevumam. ja nu kas var arī PM. Link to comment Share on other sites More sharing options...
l27 Posted May 26, 2011 Report Share Posted May 26, 2011 Es parasti ar PHP ģenerēju trigerus MySqlim. Sanāk šads: (izveidojot connection ar MySql, mainīgajam @global_user_id pieškiru aktuālo user_id, lai zinātu, kas labojis) CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER `asociacija_logging` BEFORE UPDATE ON `asociacija` FOR EACH ROW BEGIN IF OLD.NOSAUKUMS != NEW.NOSAUKUMS THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'NOSAUKUMS', NEW.ID, 'u', OLD.NOSAUKUMS, NEW.NOSAUKUMS, NOW() ); END IF; IF OLD.PILSETA != NEW.PILSETA THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'PILSETA', NEW.ID, 'u', OLD.PILSETA, NEW.PILSETA, NOW() ); END IF; IF OLD.ADRESE != NEW.ADRESE THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'ADRESE', NEW.ID, 'u', OLD.ADRESE, NEW.ADRESE, NOW() ); END IF; IF OLD.PASTA_INDEKSS != NEW.PASTA_INDEKSS THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'PASTA_INDEKSS', NEW.ID, 'u', OLD.PASTA_INDEKSS, NEW.PASTA_INDEKSS, NOW() ); END IF; IF OLD.PHONE != NEW.PHONE THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'PHONE', NEW.ID, 'u', OLD.PHONE, NEW.PHONE, NOW() ); END IF; IF OLD.FAX != NEW.FAX THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'FAX', NEW.ID, 'u', OLD.FAX, NEW.FAX, NOW() ); END IF; IF OLD.VADITAJS != NEW.VADITAJS THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'VADITAJS', NEW.ID, 'u', OLD.VADITAJS, NEW.VADITAJS, NOW() ); END IF; IF OLD.vaditaja_dzimums != NEW.vaditaja_dzimums THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'vaditaja_dzimums', NEW.ID, 'u', OLD.vaditaja_dzimums, NEW.vaditaja_dzimums, NOW() ); END IF; IF OLD.LABOTS != NEW.LABOTS THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'LABOTS', NEW.ID, 'u', OLD.LABOTS, NEW.LABOTS, NOW() ); END IF; IF OLD.LABOJIS != NEW.LABOJIS THEN INSERT INTO table_log ( tlog_user_id, tlog_table_name, tlog_column_name, tlog_row_id, tlog_action, tlog_old_val, tlog_new_val, tlog_time ) VALUES ( @global_user_id, 'asociacija', 'LABOJIS', NEW.ID, 'u', OLD.LABOJIS, NEW.LABOJIS, NOW() ); END IF; END; $$ DELIMITER ; Link to comment Share on other sites More sharing options...
Turecky Posted May 26, 2011 Author Report Share Posted May 26, 2011 Ne jau runa par to, kā tiek ģenerēti trigeri, bet gan par to, kā tas tiek uzrakstīt. l27 arī tavā piemērā kā jau minēju pirms tam IF nosacījumi atkārtojas. Jo vairāk tabulai lauku, jo vairāk IF vienādi nosacījumi jāraksta mainoties tikai dažām vērtībām. Īsāk sakot, gribētu uzrakstīt tādu trigeri, kas būtu nosacīti līdzīgs PHP funkcijai, kur darbība tiek veikta atkārtoti izejot no padotajiem parametriem, nevis atkārot vienu un to pašu darbību palielinot kodu, bet pašā darbībā mainot pāris parametrus, kas mainās vienādi. Kad biju uzrakstījis trigeri, tad secināju, ka tabulu kolonu lauku skaitu iegūst, bet tad, kad veicu pieprasījumu iekš LOOP, tad trigeris nokrešojas, ja pieprasījuma daļa tiek aizkomentēta, tad trigeris strādā. Bet vēl tāda lieta, ka īsti nezinu, kā korekti ierakstīt vērtību kas veidojas ciklā: .... while @count < @row_count do @get_colum_title = (select column_name from ...); if new.[@get_colum_title.column_name] != old.[@get_colum_title.column_name] then .... kaut kur manīju apmēram šādu new/old pierakstu, bet nezinu vai tas ir korekti utt. Kā arī īsti nesapratu, ja izmanto nevis WHILE bet LOOP, kā beigt ciklu. Link to comment Share on other sites More sharing options...
Turecky Posted May 27, 2011 Author Report Share Posted May 27, 2011 Problēma atrisināta. Beigās pamainīju iekš google meklējamos parametrus un tomēr manuālī tas bija rakstīts! (kā jau parasti tas gadās :D) Daudz kur šai lietai nav dota atbilde, bet izrādās, ka procedūrām,funkcijām un trigeriem nav atļauts veidot dinamiskus SQL pieprasījumus (MANUĀLIS) tā ka nāksies vien taisīt pa zemnieku modei un rakstīt 32 if nosacījumus :D Link to comment Share on other sites More sharing options...
Recommended Posts