2012-09-14 11 views
6

Ho bisogno di essere in grado di emettere "Crea trigger" su DBI. Non riesco a far funzionare il comando delimitatore. Qualcuno può trovare un modo per farlo funzionare?Perl, DBI e il delimitatore MySQL

Codice:

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); 

Risultati:

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. 

e che SQL funziona bene nella riga di comando di MySQL.

+2

+1 per specificare esplicitamente 'AutoCommit' e' RaiseError'. Mi piacerebbe vederne di più, su SO e in generale. – pilcrow

risposta

7

Il comando delimiter viene utilizzato dal programma client per determinare i limiti dell'istruzione SQL. È (quasi certamente) non visto dal server stesso. Pertanto, in Perl + DBI, devi semplicemente omettere i delimitatori. Pertanto, il comando da eseguire è:

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

Grazie! Questo ha fatto il trucco. A volte impilavo alcuni comandi insieme e avevo il "DELETE TRIGGER SE EXISTS" subito prima della definizione. Quello era un no-no definito. Rompiarli e rimuovere il delimitatore ha fatto il trucco. – SecondGear

Problemi correlati