MySQL Triggerek

Az embernek sokmindenre magától kell rájönnie. Van amit meg lehet tanulni iskolában és van amit nem. A harmadi kategória, amit tanítanak iskolában, de nem ott, ahova én jártam... :)

Az emberre ráragad az adatbáziskezelésből  is néhány dolog az "évek során".  Ez az a "Hallottam már róla" érzés.
Nos énis így voltam az SQL Triggerekkel, Procedure-kal és tranzakciókkal.  Mígnem egyszer eljött a nap, mikor olyan problémába ütköztem, aminél MySQL Trigger volt a megoldás kulcsa.

A probléma szavakkal így néz ki: Egy Joomla tartalomkezelőhöz készítettem olyan regisztrációs űrlapot, amin a felhasználónév, jelszó és email cím mellett több adatot ki kell tölteni. Mivel nem találtam a Joomlához ilyen kiegészítést (lehet, hogy van), ezért más úton oldottam meg.
A megoldás szavakkal: Készítettem egy űrlapot, megnéztem, hogy az adatbázis melyik táblájába menti a felvitt adatokat, majd beillesztettem a triggert az adatok adattáblába való mentése elé (BEFORE INSERT).

Nem szeretnék sokat írni az alábbi triggerről, csak néhány gondolatot:

  • A delimiter egy hasznos dolog. Ez magyarra fordítva elválasztót jelent. Nos a MySQLben az elválasztó alapértelmezetten a ; pontosvessző. Ezt a delimiter paranccsal lehet módosítani. Hogy mért van erre szükség? Mivel a triggeren belül  - ahogy látható - több művelet zajlik. Ezzel aparanccsal állítható a karakter, ami a trigger végét is jelzi.

  • A triggereknél állítható, hogy az mikor fusson. Itt látható, hogy a jos_regi_ckforms_1 táblát figyeli és minden beillesztés előtt lefut.

  • A declare sorban a trigger futása során használni kívánt változókat kell meghatározni. Jelen esetben ezek számok.

  • A SET NEW.pass = md5( NEW.pass ); egy érdekes dolog. Konyhanyelven így szólna a sor: A beszúrni kívánt pass váltózó értéke legyen az md5-tel képzett hash értéke. Tehát ezzel a módszerrel lehet változtatni a beszúrni kívánt adat értékét

  • A select id into aro_id from még érdekes lehet. Nem szükséges változóként menteni a lekérdezett adatot, egyből mehet a céltáblába.

És a triger maga:
delimiter |


drop trigger user_insert |


CREATE trigger user_insert BEFORE INSERT ON jos_regi_ckforms_1


FOR EACH ROW


BEGINNone


declare user_id, aro_id integer;


SET NEW.pass = md5( NEW.pass );


SET NEW.pass1 = md5( NEW.pass1 ) ;


INSERT INTO jos_regi_users (name,username,email,password,usertype,gid,registerDate) VALUES


 ( NEW.name, NEW.username, NEW.email, NEW.pass, 'Registered', 18, now() );


select id into user_id from jos_regi_users where  name = NEW.name AND


username = NEW.username;


INSERT INTO jos_regi_core_acl_aro


(section_value,value,order_value,name,hidden) VALUES


('users',user_id,0,NEW.name,0);


select id into aro_id from jos_regi_core_acl_aro where  value = user_id;


insert into jos_regi_core_acl_groups_aro_map (group_id,aro_id) VALUES


(18,aro_id);


END;


|


delimiter ;