【发布时间】:2015-01-09 15:29:35
【问题描述】:
我有触发器
BEFORE UPDATE ON USER_ROLES
我知道如果我在触发器中写“SELECT FROM USER_ROLES”,我会出现“mutating, trigger/function error”。这是真的,没问题!如果我从我正在更新的同一个表中选择,我会遇到这个错误 - 我知道,这很好。
但是我应该选择(没有办法)同一个表,以检测用户是否有权更新表。例如:
BEGIN
/* check if update causes loop in tree */
SELECT count(rol.id) INTO cnt
FROM USER_ROLES rol
WHERE rol.id=:old.id
START WITH rol.id = :new.parent_id
CONNECT BY PRIOR rol.id = rol.parent_id ;
IF( cnt > 0 )
THEN
....
END IF;
....
END;
我知道会有“变异、触发/功能错误”,但解决方案在哪里?在更新之前,如何检查客户端是否有权限?我可以在不写“SELECT”的情况下做类似的事情吗?
【问题讨论】:
-
这不是重复的!我知道为什么我会出错!这是另一个问题!请先阅读问题!
-
您知道选择和更新角色可以不同吗?您可以选择但不能更新。所以你的测试在这里会失败。为什么不让它插入/更新?如果有一些异常,请相应地处理它。让我相信这是xy problem
-
我有用户角色图。当管理员更新角色时,他/她不应该设法使循环。为此,我编写了触发器,它检查是否会有循环如果更新操作会有循环,触发器会抛出错误。更新前我检查是否会有循环,如果管理员执行更新命令。不是都清楚了吗?
-
我找到了解决方案,DECLARE PRAGMA AUTONOMOUS_TRANSACTION;你怎么看?在文档中写到它暂停事务并创建新事务。当我从 java 业务逻辑开始事务时,没有任何新的。
标签: oracle oracle11g oracle10g