【问题标题】:how to write sql logic to trigger when it is not permitted (when tables are same what is updating)如何编写sql逻辑以在不允许时触发(当表相同时正在更新)
【发布时间】: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


【解决方案1】:
DECLARE  PRAGMA AUTONOMOUS_TRANSACTION; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2011-10-13
    • 2013-05-08
    • 1970-01-01
    相关资源
    最近更新 更多