非递归过程中超出递归限制

Posted

技术标签:

【中文标题】非递归过程中超出递归限制【英文标题】:Recursion limit exceeded in non-recusrive procedure 【发布时间】:2015-05-20 15:09:02 【问题描述】:

我有一个调用另一个过程的过程。他们从不互相打电话或打电话给自己,但我收到一个错误响应,表明他们是。程序如下:

CREATE PROCEDURE grantPermission (perm VARCHAR(30), target VARCHAR(30), id VARCHAR(8), host VARCHAR(45), passwd VARCHAR(45))
  BEGIN 
    SET @setPermissionCmd = CONCAT('GRANT ', perm, ' ON ', target, ' TO ''', id, '''@''', host, ''' IDENTIFIED BY ''', passwd, ''';');
    PREPARE setPermissionStmt FROM @setPermissionCmd;
    EXECUTE setPermissionStmt;
    DEALLOCATE PREPARE setPermissionStmt;
    FLUSH PRIVILEGES;
  END

CREATE PROCEDURE grantAdmin (id VARCHAR(8), host VARCHAR(45), passwd VARCHAR(45))
  BEGIN
    CALL grantPermission('EXECUTE', 'PROCEDURE createUser', id, host, passwd);
    CALL grantPermission('EXECUTE', 'PROCEDURE grantAdmin', id, host, passwd);
    CALL grantPermission('EXECUTE', 'PROCEDURE revokeAdmin', id, host, passwd);
    CALL grantPermission('INSERT,UPDATE', 'TaskType', id, host, passwd);
    CALL grantPermission('UPDATE', 'User', id, host, passwd);
    UPDATE User SET isAdmin=1 WHERE dbUser=id;
    FLUSH PRIVILEGES;
  END

当我调用第二个过程时,我得到以下响应:

MariaDB [pattsdb]> CALL grantAdmin('patts', '%', 'patts');
ERROR 1456 (HY000): Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine grantAdmin

为什么它认为我的过程是递归的?仅仅因为定义文本中提到了名称?

【问题讨论】:

【参考方案1】:

将此添加到存储过程的开头:

SET max_sp_recursion_depth=255;

【讨论】:

这行得通,但为什么我首先需要它?只是糟糕的解析实践? 也许这个表有一个触发器运行这个 SP,它改变了表(这里是递归) 表上没有触发器。这是一个非常小的数据库,有 4 个表和一些 SP,每个不超过 10 行。 对于初学者,请在 Create Procedure 行之前添加它

以上是关于非递归过程中超出递归限制的主要内容,如果未能解决你的问题,请参考以下文章

RecursionError:比较中超出了最大递归深度'

递归如何转换为非递归

C++实现二叉树 前中后序遍历(递归与非递归)非递归实现过程最简洁版本

Python - RecursionError:比较错误中超出了最大递归深度[重复]

杨辉三角形 递归与非递归

3.4.4 利用栈将递归转换成非递归的方法