SQL TRIGGER

05/01/2014 21:07 .Like#1
Hallo,
ich möchte in meiner DB einen TRIGGER erstellen.

Und zwar soll dieser aktiviert werden wenn, in der tabelle "Account" ( enthält: ID (PK), AccName, Level ) das level auf "35" gesetzt wird. Anschließend soll in der Tabelle " Switch " ein neuer eintrage mit ID(Fremdschlüssel von Account), und Anzahl 3 erstellt werden.

Ich habe es mir ungefähr so vorgestellt, nur leider funktioniert meine vorstellung nicht :D Wäre auch zu schön.

PHP Code:
CREATE TRIGGER switcher_update
      AFTER UPDATE
      ON account
      
FOR EACH ROW BEGIN
            
IF `level` = "20" THEN
                  INSERT INTO switcher 
(IDSwitcherVALUES (new.id3); 
Kann mir jemand helfen?
05/02/2014 00:15 flogi333#2
1. Nimm bitte mal den ganzen Ausdruck, und setz ihn in einen Block mit einem anderen Delimiter.
Code:
DELIMITER //;
<HIER IST DEIN STATEMENT>
//
DELIMITER ;//
2. Einen IF und BEGIN Block solltest du mit END IF und END schließen
Code:
BEGIN
IF
#####
END IF;
END;

Ich bin leider gerade nicht zuhause, also habe ich keine Möglichkeit es zu probieren, aber ich vermute das der Punkt 1 dein Fehler ist.
05/02/2014 11:18 .Like#3
Vielen Dank, das hat erstmal schon geholfen.

Ich bin auch weiter vorran gekommen. Habe eine Funktion erstellt

PHP Code:
DELIMITER //
CREATE PROCEDURE test1
BEGIN
DECLARE mid INTEGER;
DECLARE 
ALT INTEGER;
SELECT `AlterFROM tabelle1 WHERE `Alter` = 18 INTO ALT;
IF (`
ALT` >= 18THEN
SELECT ID FROM tabelle1 WHERE 
`alter` = 18 INTO mid;
INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (mid,"100");
ELSE 
SELECT from tabelle1;
END IF;
END //
DELIMITER 
Das funktioiert auch gut, sobald das alter einer Person auf 18 gesetzt wird und ich die funktion ausführe. Wird automatisch ein Eintrag in tabelle 2 mit der jeweiligen ID und dem Punktestand 100 erstellt.

Meine letztes Problem ist nun, sobald mehrere Personen 18 sind und ich diese Funktion ausführe kommt eine Fehlermeldung.

Code:
#1172 - Result consisted of more than one row
PS: Nicht wundern Spalten Namen sind anders. && Die ELSE funktion ist vorerst sinnlos.
05/02/2014 13:07 flogi333#4
Das Problem ist das du in die Variable ALT alle Werte hineinschreibst, bei denen der Wert 18 ist. Die Variable kann aber nur einen Wert enthalten, und falls mehrere Spalten diesen Wert aufweisen tritt der Fehler auf.

Du kannst das z.B. mit einem INSERT und einem SELECT als Subquery lösen.
e.G.
Code:
INSERT 
INTO tabelle2 
(`ID`,`Punkte`) 
SELECT ID, "100" 
FROM tabelle1 
WHERE alter >= 18;
Damit würden alle Spalten mit dem Wert 18 in die tabelle2 geschrieben.


Außerdem hat deine IF Verzweigung keinen Sinn gemacht, denn du holst alle Werte, die bei Alter GENAU 18 haben, und überprüfst dann, ob es welche gibt die größer oder gleich 18 sind :)
Code:
SELECT `Alter` FROM tabelle1 WHERE `Alter` = 18 INTO ALT;
IF (`ALT` >= 18) THEN
#edit So viele Rechtschreibfehler.. ahhhhh o.O
05/02/2014 16:26 .Like#5
Hm so funktioniert es leider nicht. Nach INSERT INTO muss VALUES folgen und keine abfrage, so kenn ich es zumindest, und so funktioniert es leider auch nur.

Aber du hast recht war vieles sinnfrei der neue code sieht so aus :

PHP Code:
BEGIN
DECLARE ALT INTEGER;
SELECT `IDFROM tabelle1 WHERE `Alter` >= 18 INTO ALT;
INSERT INTO tabelle2 (`ID`,`Punkte`) VALUES (ALT,"100");
END 
Das funktioniert auch, nur leider noch nicht mit mehreren einträgen
05/02/2014 16:59 flogi333#6
Nun es sollte theoretisch funktionieren.
Google's erster link ist:
[Only registered and activated users can see links. Click Here To Register...]
05/03/2014 11:28 .Like#7
Super ! Es funktioniert ! :-)
Allerdings noch ein Problem, nun werden zwar auch mehrer Zeilen übertragen, allerdings auch schon übertragene ID's werden auch erneut übertragen beim wiederholen der Funktion.

Lässt sich das vermeiden?

Lässt sich das vermeiden?[/quote]

PHP Code:
BEGIN
INSERT INTO tabelle2 
(`ID`,`Punkte`)SELECT ID,100 FROM tabelle1 WHERE `alter` = 20;
END 
05/03/2014 12:08 flogi333#8
Code:
AND ID NOT IN(SELECT ID FROM tabelle2)
Wenn du das an dein WHERE anhängst, überträgt er nur diejenigen, dessesn id noch nicht in der tabelle2 sind
05/03/2014 12:44 .Like#9
Ah klar hätte ich auch selber drauf kommen können, vielen dank !