{"record":{"id":"4d434d829268365b","repo":"pentaho/pentaho-kettle","slug":"delete-database-repository-is-read-only","errorCode":null,"errorMessage":"DELETE_DATABASE : repository is read-only","messagePattern":"DELETE_DATABASE : repository is read-only","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/filerep/KettleFileRepositorySecurityProvider.java","lineNumber":90,"sourceCode":"          break;\n        case DELETE_JOB:\n          if ( capabilities.isReadOnly() ) {\n            throw new KettleException( operation + \" : repository is read-only\" );\n          }\n          break;\n        case EXECUTE_JOB:\n          break;\n        case LOCK_JOB:\n          break;\n\n        case MODIFY_DATABASE:\n          if ( capabilities.isReadOnly() ) {\n            throw new KettleException( operation + \" : repository is read-only\" );\n          }\n          break;\n        case DELETE_DATABASE:\n          if ( capabilities.isReadOnly() ) {\n            throw new KettleException( operation + \" : repository is read-only\" );\n          }\n          break;\n        case EXPLORE_DATABASE:\n          break;\n\n        case MODIFY_SLAVE_SERVER:\n        case MODIFY_CLUSTER_SCHEMA:\n        case MODIFY_PARTITION_SCHEMA:\n          if ( capabilities.isReadOnly() ) {\n            throw new KettleException( operation + \" : repository is read-only\" );\n          }\n          break;\n        case DELETE_SLAVE_SERVER:\n        case DELETE_CLUSTER_SCHEMA:\n        case DELETE_PARTITION_SCHEMA:\n          if ( capabilities.isReadOnly() ) {\n            throw new KettleException( operation + \" : repository is read-only\" );\n          }","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/filerep/KettleFileRepositorySecurityProvider.java#L72-L108","documentation":"validateAction rejects DELETE_DATABASE when the repository is read-only. Deleting a stored database connection is a mutation, so the security provider checks capabilities.isReadOnly() and throws before any file operation.","triggerScenarios":"KettleFileRepository.deleteDatabase(...) (or deleteRepositoryObject for a database element) invoked on a read-only file repository.","commonSituations":"Cleaning up obsolete connections in a repository mounted read-only from a network share, or scripts using a viewer-only repository connection.","solutions":["Open the repository read-write before deleting.","Fix filesystem permissions on the repository directory.","Delete the connection via a different (writable) repository instance.","Manually remove the element file from the repository directory if a writable mount is temporarily unavailable."],"exampleFix":"// before\nreadOnlyRepo.deleteDatabase(dbMeta.getObjectId());\n// after\nrepoMeta.setReadOnly(false);\nrepo.connect();\nrepo.deleteDatabase(dbMeta.getObjectId());","handlingStrategy":"try-catch","validationCode":"if (repo.getSecurityProvider().isReadOnly()) {\n  throw new IllegalStateException(\"Repository read-only; cannot delete database connection\");\n}","typeGuard":"boolean canDelete = repo != null && !repo.getSecurityProvider().isReadOnly();","tryCatchPattern":"try {\n  repo.deleteDatabase(dbMeta.getObjectId());\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"repository is read-only\")) {\n    // request write access or delete via writable connection\n  } else { throw e; }\n}","preventionTips":["Guard delete operations with an isReadOnly() check.","Give service accounts write permission on the repository directory.","Schedule cleanup jobs with read-write repository connections."],"tags":["repository","read-only","delete"],"backgroundTag":"permission-denied","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}