【问题标题】:Trigger in Doctrine Migrations在教义迁移中触发
【发布时间】:2016-02-14 09:14:14
【问题描述】:

我正在尝试在学说迁移类中创建一个相当复杂的触发器:

https://github.com/2ndQuadrant/audit-trigger/blob/master/audit.sql

第一个冲动只是将整个触发代码放在一个大块中并添加它

与:

public function up(Schema $schema)
{
    $this->addSql($triggerSqlInABigBlob);
}

然而迁移失败

SQLSTATE[42601]: Syntax error: 7 ERROR:  cannot insert multiple commands into a prepared statement

这甚至可以在学说迁移中进行管理吗?是否有解决方法/最佳做法来做到这一点?

【问题讨论】:

    标签: doctrine-orm doctrine doctrine-migrations


    【解决方案1】:

    Doctrine 的AbstractMigration 中的addSql 需要一个 SQL 命令或多个 SQL 命令的数组。您发送的是一个包含多个 SQL 命令的字符串,这是不允许的。你可以试试这个:

    public function up(Schema $schema)
    {
        $this->addSql(explode(';',$triggerSqlInABigBlob));
    }
    

    这应该将字符串转换为一个数组,其中每个元素都是一个 SQL 命令。不过,cmets 可能是个问题。

    【讨论】:

    • 这并不能解决 OP 的问题。尽管您所说的是正确的,但添加触发器是一个可能包含语句分隔符(“;”)的语句。 split() 结果是错误的,但即使正确拆分它也不允许教义成功地为包含分隔符的触发器执行 CREATE TRIGGER
    • @istepaniuk 我认为这完全解决了 OP 的问题,或者至少解决了第一个问题 - 错误 cannot insert multiple commands into a prepared statement,SQL 文件包含触发器的事实在撰写本文时并不重要( 4 年前)。如果你打电话给$this->addSql('SELECT 1; SELECT 1;');,你会得到同样的错误,这就是我的意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多