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.
delimiter |
drop trigger user_insert |
CREATE trigger user_insert BEFORE INSERT ON jos_regi_ckforms_1
FOR EACH ROW
BEGIN
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 ;