【问题标题】:Perl, DBI and the MySQL delimiterPerl、DBI 和 MySQL 分隔符
【发布时间】:2012-09-07 04:18:15
【问题描述】:

我需要能够通过 DBI 发出“创建触发器”。我似乎无法让分隔符命令正常工作。任何人都可以找到一种方法来完成这项工作吗?

代码:

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 命令行中运行良好。

【问题讨论】:

  • +1 用于明确指定 AutoCommitRaiseError。我希望看到更多关于 SO 和一般情况的内容。

标签: mysql perl dbi delimiter


【解决方案1】:

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

【讨论】:

  • 谢谢!那成功了。我有时将几个命令堆叠在一起,并在定义之前有“如果存在则删除触发器”。那是绝对的禁忌。将它们分解并删除分隔符就可以了。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2012-09-05
  • 2012-10-01
  • 2013-02-01
  • 2020-02-26
  • 2011-03-26
  • 2014-12-12
  • 2015-06-22
相关资源
最近更新 更多