2012-09-14 28 views
6

DBI üzerinde "tetik oluştur" oluşturmaya ihtiyacım var. Sınırlayıcı komutunu çalıştırmaya gelemiyorum. Bu işi yapmak için bir yol bulabilir mi?Perl, DBI ve MySQL sınırlayıcısı

Kodu:

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

Sonuçlar:

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. 

ve SQL MySQL komut satırına çalışıyor söyledi.

+2

+1 açıkça 'AutoCommit' ve' RaiseError' belirtmek için. Daha fazlasını, SO ve genel olarak görmek isterim. – pilcrow

cevap

7

delimiter komutu, SQL deyiminin sınırlarını belirlemek için istemci programı tarafından kullanılır. Sunucu tarafından görülemez (neredeyse kesinlikle). Bu nedenle, Perl + DBI'de, sınırlayıcıları atlamanız gerekir. Böylece, yürütme gereken komut:

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

Teşekkürler! Bu hile yaptı. Bazen birkaç komutu bir araya getiririm ve tanımdan hemen önce "SİLİNDEN SİLİNDE SİLİNİZİ SİLENDİRİN". Bu kesin bir hayır değildi. Onları kırmak ve sınırlayıcıyı çıkarmak hile yaptı. – SecondGear