Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi ce déclencheur MySQL provoque-t-il un débordement de pile ?

J'ai rencontré le même problème aujourd'hui, chaque déclencheur provoquant un dépassement de pile. Il s'est avéré que mon installation Zend Community Server est livrée avec un fichier my.cnf par défaut dans lequel la taille de thread_stack était définie sur 128K, ce qui a donné 131072 octets disponibles pour la pile dans chaque thread :

mysql> show variables where `Variable_name` = 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 131072 |
+---------------+--------+

J'ai donc commenté la ligne dans /usr/local/zend/mysql/data/my.cnf, redémarré le démon mysql, et voilà ! Le par défaut 192K est

mysql> show variables where `Variable_name` = 'thread_stack';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| thread_stack  | 196608 |
+---------------+--------+

Maintenant, la gâchette de votre table et de votre tchester fonctionne parfaitement :) (notez cependant le délimiteur)

mysql> CREATE TABLE `job_title` (
    ->   `job_id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `position_id` int(11) DEFAULT NULL,
    ->   `title` varchar(255) COLLATE latin1_general_cs NOT NULL,
    ->   `selectable` tinyint(4) NOT NULL DEFAULT '0',
    ->   PRIMARY KEY (`job_id`),
    ->   UNIQUE KEY `title` (`title`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.14 sec)

mysql> DELIMITER &&
mysql> create trigger job_position_trigger   
    ->   before insert on job_title for each row  
    -> begin    
    ->     if new.position_id is null then       
    ->        set @position = (select max(position_id)+1 from job_title);
    ->        if @position is null then set @position = 1; end if;
    ->        set new.position_id = @position;    
    ->     end if;  
    -> end; 
    -> &&
Query OK, 0 rows affected (0.29 sec)

mysql> DELIMITER ;
mysql> insert into job_title (title, selectable) values ("test", 1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into job_title (title, selectable) values ("test2", 3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from job_title;
+--------+-------------+-------+------------+
| job_id | position_id | title | selectable |
+--------+-------------+-------+------------+
|      1 |           1 | test  |          1 |
|      2 |           2 | test2 |          3 |
+--------+-------------+-------+------------+
2 rows in set (0.00 sec)

L'erreur que vous avez, 9024 octets utilisés sur une pile de 131072 octets et 128000 octets nécessaires, est logique :9024 + 128000> 131072.