2011-01-25 4 views
0

J'essaye de créer un trigger. Tout d'abord j'ai créé les employés de la table et la table employees_audit:Erreur dans mysql Trigger

CREATE TABLE employees (
    employeeNumber int(11) NOT NULL, 
    lastName varchar(50) NOT NULL, 
    firstName varchar(50) NOT NULL, 
    extension varchar(10) NOT NULL, 
    email varchar(100) NOT NULL, 
    officeCode varchar(10) NOT NULL, 
    reportsTo int(11) default NULL, 
    jobTitle varchar(50) NOT NULL, 
    PRIMARY KEY (employeeNumber) 
) 

CREATE TABLE employees_audit ( 
id int(11) NOT NULL AUTO_INCREMENT, 
employeeNumber int(11) NOT NULL, 
lastname varchar(50) NOT NULL, 
changedon datetime DEFAULT NULL, 
action varchar(50) DEFAULT NULL, 
PRIMARY KEY (id) 
) 

Puis j'ai créé le déclencheur:

DELIMITER $$ 
CREATE TRIGGER before_employee_update 
BEFORE UPDATE ON employees 
FOR EACH ROW BEGIN 
INSERT INTO employees_audit 
SET action = 'update', 
employeeNumber = OLD.employeeNumber, 
lastname = OLD.lastname, 
changedon = NOW(); END$$ 
DELIMITER ; 

deux Première table et deuxième est créé, mais quand j'exécute le déclencheur je reçois un erreur

#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 'DELIMITER $$ 
CREATE TRIGGER before_employee_update 
BEFORE UPDATE ON employe' at line 1 

Y at-il une erreur dans mon code ou ai-je besoin d'une autre version de MySQL?

+0

J'ai mis à jour ma réponse. On dirait que vous avez ignoré quelque chose de trivial. – Nishant

Répondre

0

L'exécutez-vous depuis phpMyAdmin? Si tel est le cas, le délimiteur doit être défini dans un champ situé sous la zone de texte SQL et non dans la zone de texte elle-même.

Et non. Contrairement à la réponse qui a été supprimé, il n'y a pas ; nécessaire après DELIMITER $$ parce que cela delimiter à régler le $$;

0
bien

, j'ai ce que vous faites mal. Voir l'exécution ci-dessous:

mysql> CREATE TABLE employees_audit (
-> id int(11) NOT NULL AUTO_INCREMENT, 
-> employeeNumber int(11) NOT NULL, 
-> lastname varchar(50) NOT NULL, 
-> changedon datetime DEFAULT NULL, 
-> action varchar(50) DEFAULT NULL, 
-> PRIMARY KEY (id) 
-> ) 
-> 
-> DELIMITER $$ 
-> CREATE TRIGGER before_employee_update 
-> BEFORE UPDATE ON employees 
-> FOR EACH ROW BEGIN 
-> INSERT INTO employees_audit 
-> SET action = 'update', 
-> employeeNumber = OLD.employeeNumber, 
-> lastname = OLD.lastname, 
-> changedon = NOW(); END$$ 

erreur 1064 (42000): Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité « DELIM ITER $$

RANG A BELL? RESSEMBLE?

amis, vous avez (le plus probable) oublié de mettre un ; à la fin de create table directive. Le code ci-dessous fonctionne:

mysql> 
    mysql> CREATE TABLE employees_audit (
     -> id int(11) NOT NULL AUTO_INCREMENT, 
     -> employeeNumber int(11) NOT NULL, 
     -> lastname varchar(50) NOT NULL, 
     -> changedon datetime DEFAULT NULL, 
     -> action varchar(50) DEFAULT NULL, 
     -> PRIMARY KEY (id) 
     -> ); 
    Query OK, 0 rows affected (0.09 sec) 

    mysql> 
    mysql> DELIMITER $$ 
    mysql> CREATE TRIGGER before_employee_update 
     -> BEFORE UPDATE ON employees 
     -> FOR EACH ROW BEGIN 
     -> INSERT INTO employees_audit 
     -> SET action = 'update', 
     -> employeeNumber = OLD.employeeNumber, 
     -> lastname = OLD.lastname, 
     -> changedon = NOW(); END$$ 
    Query OK, 0 rows affected (0.01 sec) 

    mysql> DELIMITER ; 

RÉPONSE VIEUX

essayer cette

DELIMITER $$ 
CREATE TRIGGER before_employee_update BEFORE UPDATE ON employees 
FOR EACH ROW 
BEGIN 
    INSERT INTO employees_audit 
    SET action = 'update', 
    employeeNumber = OLD.employeeNumber, 
    lastname = OLD.lastname, 
    changedon = NOW(); 
END;$$ 
DELIMITER ; 

manquant ; après END, je suppose,

Modifier: fixed foramtting

Edit1: re-réponse.

+0

Non, il ne devrait pas y avoir ';' – Mchl

+0

encore obtenir erreur DELIMITER $$ CREER TRIGGER before_employee_update AVANT MISE À JOUR employés pour chaque ligne BEGIN INSERT INTO employees_audit action SET = 'update', employeeNumber = OLD.employeeNumber, LastName = VIEUX.nom, changedon = NOW(); END; $$ DELIMITER; MySQL a déclaré: Documentation # 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'DELIMITER $$ CREATE TRIGGER before_employee_update AVANT MISE À JOUR ON employés ' à la ligne 1 –

+0

@ G-Rajendra mise à jour la réponse. @Mchl Yep. Juste démontré, frappant ma vieille réponse. – Nishant