{"record":{"id":"701a1cfa091701af","repo":"apache/dolphinscheduler","slug":"delete-project-error-defines-not-null","errorCode":"DELETE_PROJECT_ERROR_DEFINES_NOT_NULL","errorMessage":"Please delete the workflow definitions in project first! project code:{}.","messagePattern":"Please delete the workflow definitions in project first! project code:(.+?)\\.","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java","lineNumber":353,"sourceCode":"     * delete project by code\n     *\n     * @param loginUser   login user\n     * @param projectCode project code\n     * @return delete result code\n     */\n    @Override\n    public Result deleteProject(User loginUser, Long projectCode) {\n        Result result = new Result();\n        Project project = projectDao.queryByCode(projectCode);\n\n        checkHasProjectWritePermissionThrowException(loginUser, project);\n        checkProjectAndAuthThrowException(loginUser, project, PROJECT_DELETE);\n\n        List<WorkflowDefinition> workflowDefinitionList =\n                workflowDefinitionDao.queryAllDefinitionList(project.getCode());\n\n        if (!workflowDefinitionList.isEmpty()) {\n            log.warn(\"Please delete the workflow definitions in project first! project code:{}.\", projectCode);\n            putMsg(result, Status.DELETE_PROJECT_ERROR_DEFINES_NOT_NULL);\n            return result;\n        }\n        // delete the task group\n        taskGroupService.deleteTaskGroupByProjectCode(project.getCode());\n\n        boolean delete = projectDao.deleteById(project.getId());\n        if (delete) {\n            log.info(\"Project is deleted and id is :{}.\", project.getId());\n            result.setData(Boolean.TRUE);\n            putMsg(result, Status.SUCCESS);\n        } else {\n            log.error(\"Project delete error, project code:{}, project name:{}.\", projectCode, project.getName());\n            putMsg(result, Status.DELETE_PROJECT_ERROR);\n        }\n        return result;\n    }\n","sourceCodeStart":335,"sourceCodeEnd":371,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectServiceImpl.java#L335-L371","documentation":"deleteProject returns DELETE_PROJECT_ERROR_DEFINES_NOT_NULL when the project still contains workflow definitions. DolphinScheduler refuses to delete a non-empty project to avoid orphaning workflow definitions; all workflows must be deleted first.","triggerScenarios":"DELETE /projects/{code} (or deleteProject) while queryAllDefinitionList(project.getCode()) returns at least one workflow definition for the project.","commonSituations":"Cleaning up old projects that were used in production; deleting a project copied from a template that shipped with workflows; teardown scripts that delete projects but not their workflow definitions first.","solutions":["Delete all workflow definitions in the project first (DELETE /process-definition/{code} for each, batch delete via /process-definition/batch-delete).","If workflows are reusable, move them to another project before deleting this project.","Automate cleanup: list definitions via GET /process-definition/list then delete each before calling project delete."],"exampleFix":"// before\nprojectService.deleteProject(user, projectCode); // DELETE_PROJECT_ERROR_DEFINES_NOT_NULL\n// after\nList<WorkflowDefinition> defs = workflowDefinitionDao.queryAllDefinitionList(projectCode);\ndefs.forEach(d -> processDefinitionService.deleteProcessDefinitionByCode(user, d.getCode()));\nprojectService.deleteProject(user, projectCode); // now succeeds","handlingStrategy":"validation","validationCode":"List<WorkflowDefinition> defs = workflowDefinitionDao.queryAllDefinitionList(projectCode);\nif (!defs.isEmpty()) throw new IllegalStateException(\"delete workflow definitions first\");","typeGuard":null,"tryCatchPattern":"catch (ServiceException e) { if (e.getCode() == Status.DELETE_PROJECT_ERROR_DEFINES_NOT_NULL) { /* delete workflows then retry */ } }","preventionTips":["Always purge workflow definitions before deleting a project.","Script teardown in the right order: workflows, then project.","Audit projects for definitions before cleanup runs."],"tags":["project","workflow","delete","dependency"],"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-14T05:17:10.506Z"}