【问题标题】:Laravel migrate error near BEGIN on trigger PostgreSQLLaravel 在触发器 PostgreSQL 的 BEGIN 附近迁移错误
【发布时间】:2017-12-26 00:03:58
【问题描述】:

我在 mysql 中创建了数据库触发器,在 laravel 中它工作正常,但是当我移至 postgresql 时出现错误:

SQLSTATE[42601]: Syntax error: 7 ERROR:  syntax error at or near "BEGIN"

(顺便说一句,我是使用 postgresql 的新手)

这是我在迁移中编写的代码:

DB::unprepared('CREATE TRIGGER histories_insert AFTER INSERT ON packets FOR EACH ROW
        BEGIN
            IF new.status = "pending" THEN
                insert into `histories` (`packet_id`, `message`, `created_at`, `updated_at`) VALUES (new.id, "Barang berhasil di buat", now(), now());
            END IF;
        END');

我真的很困惑。希望有人可以帮助我:)

【问题讨论】:

    标签: php mysql postgresql laravel


    【解决方案1】:

    mysql 和 postgre 的语法和结构不同,在 Postgres 中我们必须先编写触发器函数(过程),然后我们在触发器的主体中调用它

    之后

    FORE EACH ROW
    

    应该有

    when event __type_of_event__
    

    然后我们调用我们的触发函数

    execute procedure __procedure_name__
    

    查看关于触发器here的文档

    并触发程序here

    注意when event是可选的,过程中的字段名称应该改为纯文本,或者用双引号括起来(如果它与大写字母混合)

    不用担心文档的版本,postgresql触发器跨版本是一致的,希望对你有帮助!

    【讨论】:

    • 感谢您提供有关 postgresql 的更多详细信息...这真的很有帮助... :)
    • 很好,这是我的荣幸!
    【解决方案2】:

    你需要把它做成一个程序:

    来自文档:

    PostgreSQL 只允许执行触发动作的用户定义函数。该标准允许执行许多其他 SQL 命令,例如 CREATE TABLE,作为触发操作。通过创建一个执行所需命令的用户定义函数,这个限制并不难解决。

    DB::unprepared('CREATE TRIGGER histories_insert 
                    AFTER INSERT ON packets 
                    FOR EACH ROW
                    EXECUTE PROCEDURE that_procudure_you_wrote_with_that_content(new)');
    

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2018-07-06
      相关资源
      最近更新 更多