2012-09-14 10 views
6

Ich muss "create trigger" über DBI ausgeben können. Ich kann nicht scheinen, dass der Begrenzerbefehl funktioniert. Kann jemand einen Weg finden, dies zum Funktionieren zu bringen?Perl, DBI und das MySQL-Delimiter

Code:

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

Ergebnisse:

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. 

und dass SQL arbeitet an der MySQL-Kommandozeile in Ordnung.

+2

+1 für explizite Angabe von 'AutoCommit' und' RaiseError'. Ich würde gerne mehr davon sehen, auf SO und im Allgemeinen. – pilcrow

Antwort

7

Der Befehl delimiter wird vom Client-Programm verwendet, um die Grenzen der SQL-Anweisung zu bestimmen. Es wird (fast sicher) nicht vom Server selbst gesehen. Daher sollten Sie in Perl + DBI die Trennzeichen einfach weglassen. Der folgende Befehl lautet:

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

Danke! Das hat den Trick gemacht. Ich stapelte manchmal ein paar Befehle zusammen und hatte die "DELETE TRIGGER IF EXISTS" direkt vor dem Definieren. Das war ein klares Nein. Sie aufzubrechen und den Begrenzer zu entfernen, hat den Trick gemacht. – SecondGear