Jump to content
php.lv forumi
Turecky

MySQL Trigri

Recommended Posts

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.

Share this post


Link to post
Share on other sites

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 ;

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

×
×
  • Create New...