2012-09-14 16 views
6

私はDBIに対して "create trigger"を発行する必要があります。区切り文字コマンドが動作しないようです。誰もこの仕事をする方法を見つけることができますか?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です。私はSOと一般的にそれ以上のことを見たいと思います。 – pilcrow

答えて

7

delimiterコマンドは、クライアントプログラムがSQL文の制限を判断するために使用します。 (ほぼ確実に)サーバー自体には見られません。したがって、Perl + DBIでは、デリミタを省略するだけです。したがって、あなたが実行すべきコマンドは: `AutoCommit`と` RaiseError`を明示的に指定するためには、

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

ありがとう!それがトリックでした。私はときどき一緒にいくつかのコマンドを積み重ね、定義の直前に "存在する場合は削除する"をしました。それは明確なノーではなかった。それを打ち切り、デリミタを取り除くことがそのトリックでした。 – SecondGear

関連する問題