SQL 触发器 - 有一个会搞乱新的 SQL 查询

Posted

技术标签:

【中文标题】SQL 触发器 - 有一个会搞乱新的 SQL 查询【英文标题】:SQL Trigger - Having one is messing up new SQL queries 【发布时间】:2021-10-04 01:34:50 【问题描述】:

我可以手动执行以下代码:

UPDATE pfields_cont p, members m
   SET m.member_group_id = 6
 WHERE p.member_id = m.member_id
   AND m.member_group_id != 6
   AND p.field_2 = 'Teacher';

但是,如果我尝试使用与上述相同的代码创建触发器,则会在我的数据库中创建新用户时收到此错误:

无法更新存储函数/触发器中的表“成员”,因为它是 已被调用此存储函数/触发器的语句使用 (1442)

谁能帮忙修复触发器?

谢谢!

编辑 1:

完整的触发器定义:

CREATE TRIGGER `newTeacher` AFTER INSERT ON `members` FOR EACH ROW UPDATE
    pfields_cont p,
    members m
SET
    m.member_group_id = 6
WHERE
    p.member_id = m.member_id
    AND m.member_group_id != 6
    AND p.field_2 = 'Teacher'

【问题讨论】:

你如何“...在我的数据库中创建一个新用户...”?您的创建查询似乎干扰了触发器。 触发器监听的事件是什么? @TheImpaler 它是一个 INSERT 命令。类似于:“插入membersgroup_idgroup_othersjoinediptimezone ...)值(1,'' ...)”。 该错误意味着您无法在触发器处理中的任何位置引用 same 表。 (用于阅读或写作) 让我们continue this discussion in chat. 【参考方案1】:

由于您不能在触发器的定义中引用同一个表(用于读取或写入),因此可以通过将 member_group_id 设置为 6(如果 field_2Teacher)来简化触发器处理:

CREATE TRIGGER `newTeacher` BEFORE INSERT ON `members`
FOR EACH ROW UPDATE
BEGIN
    Declare fieldInfo varchar(30);

    SELECT field_2 INTO fieldInfo 
      FROM pfields_cont 
     WHERE pfields_cont.member_id = NEW.member_ID;

    IF fieldInfo = 'Teacher' THEN
        SET NEW.member_group_id = 6;
    END IF;
END;

【讨论】:

以上是关于SQL 触发器 - 有一个会搞乱新的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 触发器:更新查询新旧数据

如何查看 Access 中按钮触发的 SQL 查询?

SQL - 触发更新错误

插入查询在 SQL 中花费了很多时间

内联 SQL 查询和实体框架触发的查询有啥区别?

使用 sql-injection 创建数据库触发器,无需堆叠查询