【问题标题】:Sequelize - how to define a trigger in a model?Sequelize - 如何在模型中定义触发器?
【发布时间】:2020-04-14 10:43:07
【问题描述】:

我目前正在使用 RDS Aurora DB 上的 sequelize,我需要跟踪哪些表中的哪些记录被删除 - 为此,我创建了一个新表 dbLog。现在我需要在数据库中添加一个触发器,每当表 t1 中的记录被删除时,它将记录的 id 保存到 dbLog 表中。基本上,我需要为已部署的数据库和尚不存在的数据库介绍两种情况。

  1. 数据库已经存在。这很容易,因为我可以像这样通过原始查询创建触发器
CREATE TRIGGER trigger AFTER DELETE ON t1 FOR EACH ROW 
INSERT INTO dbLog ( id, tableName, status, updatedAt ) 
VALUES (OLD.id, 't1', 'D', NOW())`
  1. 数据库不存在。这是有问题的,因为它是通过初始化模型然后 sequelize.sync() 创建的。所以我不能只调用原始查询,而是需要在模型中为 t1 表定义这个触发器。这就是我启动表格的方式(简化)
t1.init(
        {
            id: {
                type: new DataTypes.BIGINT,
                autoIncrement: true,
                primaryKey: true
            },
            name: {
                type: new DataTypes.STRING,
                allowNull: false
            }    
        },
        {
            sequelize,           
            tableName: 't1',
        }
    );

问题是我不知道如何创建该触发器。我尝试将这样的内容放入 t1.Init 的属性部分。但是有一些问题,当我检查数据库的触发器时,没有创建任何触发器。我该如何解决?甚至通过这种方式创建的触发器是否与原始查询创建的触发器 1:1 等效?非常感谢。

hooks: {
    afterDestroy: function(t1) {
        DbLog.create({
           id: t1.id,
           tableName: 't1',
           status: 'D',
           updatedAt: '2015-10-02'
           })
       }
   }

【问题讨论】:

    标签: mysql sequelize.js database-trigger amazon-aurora


    【解决方案1】:

    您应该通过执行原始 SQL 查询在数据库中手动创建触发器。如果您正在使用迁移,那么只需创建一个带有触发器创建的迁移(也是一个原始 SQL 查询)。

    【讨论】:

    • 是的,这就是我最后所做的——我无法通过 sequlize 创建触发器,至少不等同于原始 SQL 创建的触发器。所以我找到了在 sequelize.sync() 之后执行原始查询的方法
    猜你喜欢
    • 2020-01-28
    • 2019-05-25
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多