Postgres 函数未执行另一个函数中定义的 INSERT 语句

问题描述

我有一个 UserRole 表,用于存储分配给用户的所有角色。我有两个单独的 Postgres 函数用于创建和更新角色:

saveRole(boolean,jsonb)
updateRole(boolean,jsonb)

现在我必须编写一个函数来根据以下用例更新 UserRole 表:

All PrevIoUs Roles Deleted
Few Roles Deleted/Added

如果添加了任何新角色,则还应使用 Role 函数将其添加saveRole(boolean,jsonb) 表中。如果更新了任何角色,则它应该使用 updateRole(boolean,jsonb) 函数

这是我编写的函数,但不知何故在此函数以及 saveRole / updateRole 函数中定义的 INSERT 语句无法正常工作。

BEGIN

    v_userRoleId := 1;
    v_userRoles  JSONB;
    v_prevRoleId NUMERIC;
    v_roleId     NUMERIC;

    SELECT To_Role FROM User_Role WHERE ID = v_userRoleId INTO v_prevRoleId;

    RAISE NOTICE 'v_prevRoleId --> %',v_prevRoleId;

    IF (v_userRoles -> 'assignedRoles' != 'null')
    THEN
        IF (v_prevRoleId IS NOT NULL)
        THEN
            RAISE NOTICE 'v_prevRoleId IS NOT NULL ';
            SELECT * FROM updateRole(false,v_userRoles -> 'assignedRoles') INTO v_roleId;
            RAISE NOTICE 'v_roleId --> %',v_roleId;
        ELSE
            RAISE NOTICE 'v_prevRoleId IS NULL ';
            SELECT * FROM saveRole(true,v_roleId;
        END IF;
    ELSE
        RAISE NOTICE 'No Role Selected';
        v_roleId = NULL;
        IF (v_prevRoleId IS NOT NULL)
            THEN
                RAISE NOTICE 'DELETING PrevIoUs ROLE from Role Table';
                DELETE FROM ROLE WHERE id = v_prevRoleId;
        END IF;
    END IF;

    IF (v_roleId IS NOT NULL)
    THEN
        IF (v_roleId IS disTINCT FROM v_prevRoleId)
        THEN
            IF (v_prevRoleId IS NOT NULL)
            THEN
                RAISE NOTICE 'v_prevRoleId IS NOT NULL => DELETING v_prevRoleId If any';
                DELETE FROM User_Role WHERE To_Role = v_prevRoleId AND ID = v_userRoleId;
            END IF;
            RAISE NOTICE 'v_roleId IS NOT NULL => INSERTING v_roleId';
            INSERT INTO User_Role (ID,To_Role,To_User) VALUES (NEXTVAL('User_Role_Seq'),v_roleId,1);
            RAISE NOTICE 'A New Role is INSERTED with ID --> %',v_roleId;
        END IF;
    ELSE
        RAISE NOTICE 'v_roleId IS NULL => DELETING v_roleId If any';
        DELETE FROM User_Role WHERE ID = v_userRoleId;
    END IF;

END;
$$ language plpgsql;

现在忽略此语句。还有 saveRole 函数中定义的 INSERT 语句。

INSERT INTO User_Role (ID,1);

在这里遗漏了 committing the transaction 之类的东西,还是有更好的方法来执行此操作?

输入 JSONB:

{
  "id": "1","assignedRoles": {
    "system": false,"default": false,"roles": [
          {
            "id": "10","name": "Create STAFF","type": "0","created_date": "2020-10-24","modified_date": "2020-10-24"
          },{
            "id": "11","name": "DELETE STAFF","modified_date": "2020-10-24"
          }
    ]
  },"userId": "1"
}

任何帮助将不胜感激。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)