6

DBIを介して「トリガーの作成」を発行できるようにする必要があります。delimiterコマンドが機能していないようです。誰かがこれを機能させる方法を見つけることができますか?

コード:

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コマンドラインで正常に動作します。

4

1 に答える 1

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
};
于 2012-09-14T02:03:17.727 に答える