2012-09-14 11 views
6

Tengo la necesidad de poder emitir "crear activador" a través de DBI. Parece que no puedo hacer que funcione el comando delimitador. ¿Alguien puede encontrar una manera de hacer que esto funcione?Perl, DBI y el delimitador MySQL

Código:

use strict; 
use DBI; 
my $dbargs = {mysql_auto_reconnect => 1, 
       AutoCommit   => 0, 
       RaiseError   => 1, 
       ShowErrorStatement => 1}; 

my $dsn = "DBI:mysql:database=xdisp;host=cycldev06"; 
my $dbh = DBI->connect($dsn, 'sqluser', '', $dbargs); 

my $sql = qq{ 
    DELIMITER // 
     CREATE TRIGGER `hardware_last_status` BEFORE UPDATE 
      ON `hardware` FOR EACH ROW BEGIN 
           IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN 
            SET NEW.last_status = OLD.status; 
           END IF; 
          END 
      // 
}; 

$dbh->do($sql); 

Resultados:

DBD::mysql::db do failed: 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 `hardware_last_status` BEFORE UPDATE 
     ' at line 1 at test.pl line 24. 

y que SQL funciona bien en la línea de comandos de MySQL.

+2

+1 para especificar explícitamente 'AutoCommit' y' RaiseError'. Me gustaría ver más de eso, en SO y en general. – pilcrow

Respuesta

7

El comando delimiter es utilizado por el programa cliente para determinar los límites de la instrucción SQL. Es (casi seguro) no visto por el servidor en sí. Por lo tanto, en Perl + DBI, simplemente debe omitir los delimitadores. Por lo tanto, el comando que debe ejecutar es:

my $sql = qq{ 
    CREATE TRIGGER `hardware_last_status` BEFORE UPDATE 
     ON `hardware` FOR EACH ROW BEGIN 
          IF NEW.status != OLD.status AND NEW.last_status = OLD.last_status THEN 
           SET NEW.last_status = OLD.status; 
          END IF; 
         END 
}; 
+0

Gracias! Eso hizo el truco. A veces comparo algunos comandos y tuve el mensaje "ELIMINAR DISPARADOR SI EXISTE" justo antes de la definición. Eso fue un claro no-no. Romperlos y eliminar el delimitador hizo el truco. – SecondGear

Cuestiones relacionadas