Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Fehlermeldung bei Triggererstellung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von LordTerra, 21 Mai 2013.

  1. LordTerra

    LordTerra Neuer Benutzer

    DROP TRIGGER IF EXISTS `InsUser`

    DELIMITER $$

    CREATE TRIGGER InsUser BEFORE INSERT ON user
    FOR EACH ROW
    BEGIN

    DECLARE isFound INT DEFAULT 0;

    SELECT count(*) INTO isFound FROM user WHERE name = NEW.name;

    IF isFound == 0 THEN
    INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) VALUES ( NEW.name, NEW.mc_id, CURDATE(), CURTIME());
    ELSE
    UPDATE user SET lastlogin_date = CURDATE(), lastlogin_time = CURTIME() WHERE name = NEW.name;
    ENDIF;

    END;
    $$

    DELIMITER ;

    Meldung:

    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '== 0 THEN INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) V' at line 9

    warum ist das so ?

    mfg LT
     
  2. Margit

    Margit Fleissiger Benutzer Mitarbeiter

    Ist isFound eine Funktion?

    Ich würds spontan erst mal so versuchen (habs aber nicht ausprobiert):

    Code:
    FOR EACH ROW BEGIN
    IF EXISTS (SELECT x FROM tabelle WHERE ) THEN......
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Nein, war als INT-Variable definiert. Gibt es den '==' - Operator in MySQL?
     
  4. LordTerra

    LordTerra Neuer Benutzer

    ok 2 fehler gefunden : (zu c++ lastig sorry)

    1. == ist falsch darf nur =
    2. irgendwie (warum auch immer) geht die IF nicht
    hab das jetzt wie folgt:

    DROP TRIGGER IF EXISTS `InsUser`

    DELIMITER $$

    CREATE TRIGGER InsUser BEFORE INSERT ON user
    FOR EACH ROW
    BEGIN

    DECLARE isFound INT DEFAULT 0;

    SELECT count(*) INTO isFound FROM user WHERE name = NEW.name;

    CASE WHEN isFound = 0 THEN
    INSERT INTO user (name, mc_id, lastlogin_date, lastlogin_time) VALUES ( NEW.name, NEW.mc_id, CURDATE(), CURTIME());
    ELSE
    UPDATE user SET lastlogin_date = CURDATE(), lastlogin_time = CURTIME() WHERE name = NEW.name;
    END CASE;

    END$$

    DELIMITER ;

    problem hierbei: ich bekomm beim insert folgende fehlermeldung:
    #1442 - Can't update table 'user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

    meine vermutung ist ja: ich will ein insert auf die Tabelle machen und weil in meinem trigger auch ein insert steht stört das irgendwie ...
    nur wie bekomm ich das hin ?

    mein versuch war es: eine tabelle mit 4 spalten, wenn ich 2 fülle sollen die beiden anderen automatisch mit gefüllt werden
    hier soll aber vorher unterschieden werden ob ein insert oder ein update , wenn werte schon vorhanden, gemacht wird...
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Kein Insert machen, stattdessen ein return NEW. Dann macht der Trigger normal weiter. Also, jetzt nicht getestet, aber so geht's in PostgreSQL.
     
  6. LordTerra

    LordTerra Neuer Benutzer

    frage: kann ich einen "insert" befehl schicken und mittels trigger in ein Update Befehl umwandeln ?

    heisst ich schick

    insert into user ...

    <- trigger schlägt zu guckt nach ah hier is schon ein eintrag mit den daten
    <- trigger macht aus insert ein update

    ^^ geht das?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Ja:

    Code:
    test=# create table lordterra (i int);
    CREATE TABLE
    test=*# insert into lordterra values(0);
    INSERT 0 1
    test=*# create function f1() returns trigger as $$begin update lordterra set i=new.i; return null; end;$$language plpgsql;
    CREATE FUNCTION
    test=*# create trigger trg1 before insert on lordterra for each row execute procedure f1();
    CREATE TRIGGER
    test=*# select * from lordterra ;
     i
    ---
     0
    (1 row)
    
    test=*# insert into lordterra values (1);
    INSERT 0 0
    test=*# select * from lordterra ;
     i
    ---
     1
    (1 row)
    
    test=*# insert into lordterra values (99);
    INSERT 0 0
    test=*# select * from lordterra ;
     i
    ----
     99
    (1 row)
    
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden