Perl、DBI 和 MySQL 分隔符

6

我需要能够通过DBI发出“create trigger”的命令,但是我似乎无法使分隔符命令起作用。有人能找到一种方法使其正常工作吗?

代码:

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

谢谢!那个解决了问题。我有时会把几个命令堆在一起,然后在定义之前加上“DELETE TRIGGER IF EXISTS”。这是绝对不行的。将它们分开并删除分隔符就可以了。 - SecondGear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接