{"record":{"id":"de41c086498c7226","repo":"apache/dolphinscheduler","slug":"10179","errorCode":"10179","errorMessage":"Please transform project ownership [{0}]","messagePattern":"Please transform project ownership \\[(.+?)\\]","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java","lineNumber":442,"sourceCode":"        // only admin can operate\n        if (!isAdmin(loginUser)) {\n            log.warn(\"User does not have permission for this feature, userId:{}, userName:{}.\", loginUser.getId(),\n                    loginUser.getUserName());\n            throw new ServiceException(Status.USER_NO_OPERATION_PERM, id);\n        }\n        // check exist\n        User tempUser = userDao.queryById(id);\n        if (tempUser == null) {\n            log.error(\"User does not exist, userId:{}.\", id);\n            throw new ServiceException(Status.USER_NOT_EXIST, id);\n        }\n        // check if is a project owner\n        List<Project> projects = projectDao.queryProjectCreatedByUser(id);\n        if (CollectionUtils.isNotEmpty(projects)) {\n            String projectNames = projects.stream().map(Project::getName).collect(Collectors.joining(\",\"));\n            log.warn(\"Please transfer the project ownership before deleting the user, userId:{}, projects:{}.\", id,\n                    projectNames);\n            throw new ServiceException(Status.TRANSFORM_PROJECT_OWNERSHIP, projectNames);\n        }\n        // delete user\n        userDao.queryTenantCodeByUserId(id);\n\n        accessTokenDao.deleteByUserId(id);\n        sessionService.expireSession(id);\n\n        if (!userDao.deleteById(id)) {\n            log.error(\"User delete error, userId:{}.\", id);\n            throw new ServiceException(Status.DELETE_USER_BY_ID_ERROR);\n        }\n        log.info(\"User is deleted and id is :{}.\", id);\n    }\n\n    /**\n     * revoke the project permission for specified user by id\n     *\n     * @param loginUser  Login user","sourceCodeStart":424,"sourceCodeEnd":460,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/UsersServiceImpl.java#L424-L460","documentation":"Thrown by UsersServiceImpl.deleteUserById when the target user owns one or more projects. DolphinScheduler refuses to delete a project owner and raises TRANSFORM_PROJECT_OWNERSHIP (code 10179) listing the project names; ownership must be transferred first.","triggerScenarios":"DELETE users/{id} where projectDao.queryProjectCreatedByUser(id) returns a non-empty list; message contains the comma-joined project names.","commonSituations":"Offboarding employees who created projects; cleanup scripts that delete users without checking project ownership; environments where project ownership was never reassigned.","solutions":["Transfer each listed project to another user (edit the project and change owner) then retry deletion","Delete the projects if they are no longer needed","Reassign ownership via the projects API before running bulk user deletions"],"exampleFix":"// before\ndeleteUserById(loginUser, userId); // fails: user owns projects A,B\n// after\ntransferProjectOwnership(\"A\", newOwner);\ntransferProjectOwnership(\"B\", newOwner);\ndeleteUserById(loginUser, userId);","handlingStrategy":"validation","validationCode":"List<Project> owned = projectDao.queryProjectCreatedByUser(id);\nif (!owned.isEmpty()) {\n    throw new IllegalStateException(\"transfer ownership of: \" + owned.stream().map(Project::getName).collect(Collectors.joining(\",\")));\n}","typeGuard":null,"tryCatchPattern":"try { userService.deleteUserById(loginUser, id); } catch (ServiceException e) { if (e.getCode() == 10179) { transferProjectsThenRetry(e.getMessage()); } }","preventionTips":["Build offboarding checklists that include project ownership transfer","Check queryProjectCreatedByUser before batch deletions","Assign a default owner for projects when users are deprovisioned"],"tags":["user-management","project-ownership","precondition"],"backgroundTag":"invalid-state-transition","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}