2012-09-14 5 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