MYSQL触发器递归避免

MYSQL触发器递归避免,mysql,Mysql,我的users表有一个通用的更新后触发器,用于检查列是否已更改,如果已更改,则调用存储过程 问题是存储过程执行一些计算,并且自身更新用户中的字段 如果我的存储过程更新了users表(调用触发器,再次调用存储过程),如何避免递归 谢谢 MySQL不允许禁用触发器(不删除和重新创建触发器),但您有两个选项: 不要从过程中更新用户表 向用户添加一个字段,该字段将在更新时被过程设置为特定值。当触发器看到该字段的值时,不要调用该过程 使用全局变量完成上述操作(非连接安全-将禁用所有连接的触发器) MySQ

我的users表有一个通用的更新后触发器,用于检查列是否已更改,如果已更改,则调用存储过程

问题是存储过程执行一些计算,并且自身更新用户中的字段

如果我的存储过程更新了users表(调用触发器,再次调用存储过程),如何避免递归


谢谢

MySQL不允许禁用触发器(不删除和重新创建触发器),但您有两个选项:

  • 不要从过程中更新用户表
  • 向用户添加一个字段,该字段将在更新时被过程设置为特定值。当触发器看到该字段的值时,不要调用该过程
  • 使用全局变量完成上述操作(非连接安全-将禁用所有连接的触发器)

  • MySQL不允许禁用触发器(不删除和重新创建触发器),但您有两个选项:

  • 不要从过程中更新用户表
  • 向用户添加一个字段,该字段将在更新时被过程设置为特定值。当触发器看到该字段的值时,不要调用该过程
  • 使用全局变量完成上述操作(非连接安全-将禁用所有连接的触发器)

  • 不知道mysql是否允许:-s不知道mysql是否允许:-s对于#3,最好使用会话变量(即,
    @var
    而不是
    @@var
    )。您甚至可以这样使用它:当它检测到发生递归时,它会关闭(即,在触发器和过程中,如果IFNULL(@unique\u recurse\u var,0)=0,则在
    中保护潜在的递归代码,然后设置@unique\u recurse\u var=1;否则设置@unique\u recurse\u var=0;如果;
    )。您可能希望unittests确保函数永远不会中断。对于#3,最好使用会话变量(即,
    @var
    而不是
    @@var
    )。您甚至可以这样使用它:当它检测到发生递归时,它会关闭(即,在触发器和过程中,如果IFNULL(@unique\u recurse\u var,0)=0,则在
    中保护潜在的递归代码,然后设置@unique\u recurse\u var=1;否则设置@unique\u recurse\u var=0;如果;
    )。不过,您可能需要进行单元测试以确保功能永远不会中断。