2012-09-14 99 views
6

我需要能夠通過DBI發出「創建觸發器」。我似乎無法使分隔符命令工作。任何人都可以找到一種方法來使這項工作?Perl,DBI和MySQL分隔符

代碼:

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

結果:

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. 

和SQL工作正常,在MySQL命令行。

+2

+1用於顯式指定'AutoCommit'和'RaiseError'。我希望在SO和整體上看到更多。 – pilcrow

回答

7

客戶端程序使用delimiter命令來確定SQL語句的限制。它(幾乎肯定)不會被服務器本身看到。因此,在Perl + DBI中,你應該簡單地省略分隔符。因此,您應執行的命令是:

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

謝謝!那就是訣竅。我有時將一些命令疊加在一起,並在定義之前有「DELETE TRIGGER IF EXISTS」。這是一個明確的禁忌。打破它們,並刪除分隔符做了訣竅。 – SecondGear