Oracle 如何在不允许时将sql逻辑写入触发器(当表与正在更新的相同时)

Oracle 如何在不允许时将sql逻辑写入触发器(当表与正在更新的相同时),oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,我有扳机 BEFORE UPDATE ON USER_ROLES 我知道如果我在触发器中写入“从用户角色中选择”,我将出现“突变、触发器/功能错误”。这是真的,没问题如果我从正在更新的同一个表中选择,我将出现该错误-我知道,这很好。 但是我应该选择(没有办法)同一个表,以检测用户是否有权更新该表。例如: BEGIN /* check if update causes loop in tree */ SELECT count(rol.id) INTO cnt

我有扳机

 BEFORE  UPDATE  ON  USER_ROLES
我知道如果我在触发器中写入“从用户角色中选择”,我将出现“突变、触发器/功能错误”。这是真的,没问题如果我从正在更新的同一个表中选择,我将出现该错误-我知道,这很好。

但是我应该选择(没有办法)同一个表,以检测用户是否有权更新该表。例如:

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;

我知道会出现“突变、触发/功能错误”,但解决方案在哪里?更新前,如何检查客户端是否有权限?我可以在不写“选择”的情况下执行类似操作吗?

重复您之前的问题这不是重复!我知道我为什么会出错!这是另一个问题!请先看问题!您是否意识到选择和更新角色可能不同?您可以选择,但不能更新。所以你的测试在这里会失败。为什么不让它插入/更新?如果出现异常,请相应地进行处理。让我相信这是一个我有用户角色图。当管理员更新角色时,他/她不应设法进行循环。为此,我编写了触发器,它检查是否有循环,是否有更新操作的循环,触发器抛出错误。在更新之前,我检查是否会有循环,如果管理员执行更新命令。不是一切都清楚吗?我找到了解决方案,声明PRAGMA autonomy_事务;你认为呢?在单据中写着它暂停交易并创建新的。当我从java业务逻辑启动事务时,并没有任何新的内容。
DECLARE  PRAGMA AUTONOMOUS_TRANSACTION;