diff --git a/apps/desktop/src/components/sidebar/SidebarTreeRuntimeHost.vue b/apps/desktop/src/components/sidebar/SidebarTreeRuntimeHost.vue index 4e44d27d64..3f54255c9c 100644 --- a/apps/desktop/src/components/sidebar/SidebarTreeRuntimeHost.vue +++ b/apps/desktop/src/components/sidebar/SidebarTreeRuntimeHost.vue @@ -90,6 +90,7 @@ import { supportsTableStructureEditing, supportsTransfer, usesTreeSchemaMode, + isSingleDatabase, } from "@/lib/database/databaseCapabilities"; import { copyNameForTreeNode, isDocumentBrowserTreeNode, objectSourceKindForTreeNode, shouldRunTreeNodeRowAction, treeNodeRowAction, treeNodeRowDoubleClickAction } from "@/lib/sidebar/treeNodeClick"; import { dataTabOpenModeFromTreeClick, type DataTabOpenMode } from "@/lib/sidebar/dataTabOpenPolicy"; @@ -2290,7 +2291,8 @@ const canCreateSchema = computed(() => { const canDropSchema = computed(() => { const config = activeNode.value.connectionId ? connectionStore.getConfig(activeNode.value.connectionId) : undefined; - return activeNode.value.type === "schema" && !isSqlServerLinkedNode(activeNode.value) && usesTreeSchemaMode(effectiveDatabaseTypeForConnection(config)) && !connectionUsesDatabaseObjectTreeMode(config); + const dbType = effectiveDatabaseTypeForConnection(config); + return activeNode.value.type === "schema" && !isSqlServerLinkedNode(activeNode.value) && (usesTreeSchemaMode(dbType) || dbType === "dameng") && !connectionUsesDatabaseObjectTreeMode(config); }); const canEditSchemaComment = computed(() => { @@ -2949,17 +2951,30 @@ async function confirmDropSchema() { if (!node.connectionId || !node.database) return; try { await connectionStore.ensureConnected(node.connectionId); + const config = connectionStore.getConfig(node.connectionId); + const dbType = effectiveDatabaseTypeForConnection(config); const sql = dropSchemaPreviewSql.value || (await buildDropSchemaSql({ databaseType: databaseTypeForNode(node), name: node.label, })); - await executeTreeNodeSqlWithProductionGuard(node, sql, { database: node.database }); + // Dameng refuses to drop the schema the session is currently using (DM + // error "当前对象被占用"), and the JDBC agent switches the session to the + // target schema (node.schema) before executing any statement. Run the drop + // from a different schema: the connected user's own schema, or SYSDBA when + // the user's own schema is the one being dropped. + let dropExecutionSchema: string | undefined; + if (dbType === "dameng") { + const username = config?.username?.trim().toUpperCase(); + dropExecutionSchema = username && username !== node.label.trim().toUpperCase() ? username : "SYSDBA"; + } + await executeTreeNodeSqlWithProductionGuard(node, sql, { database: node.database, schema: dropExecutionSchema }); toast(t("contextMenu.dropSchemaSuccess", { name: node.label }), 3000); - const config = connectionStore.getConfig(node.connectionId); if (config?.db_type === "sqlserver") { await connectionStore.loadSqlServerDatabaseObjects(node.connectionId, node.database, { force: true }); + } else if (isSingleDatabase(dbType)) { + await connectionStore.loadDatabases(node.connectionId, { force: true }); } else { await connectionStore.loadSchemas(node.connectionId, node.database, { force: true }); } diff --git a/crates/dbx-core/src/db_admin_sql.rs b/crates/dbx-core/src/db_admin_sql.rs index 7d54c2c009..c5bac4d529 100644 --- a/crates/dbx-core/src/db_admin_sql.rs +++ b/crates/dbx-core/src/db_admin_sql.rs @@ -587,7 +587,10 @@ pub fn build_create_schema_sql(options: SchemaNameSqlOptions) -> Result String { let schema = quote_table_identifier(options.database_type, &options.name); - if matches!(options.database_type, Some(DatabaseType::Postgres | DatabaseType::Gaussdb | DatabaseType::Kwdb)) { + if matches!( + options.database_type, + Some(DatabaseType::Postgres | DatabaseType::Gaussdb | DatabaseType::Kwdb | DatabaseType::Dameng) + ) { format!("DROP SCHEMA {schema} CASCADE;") } else { format!("DROP SCHEMA {schema};") @@ -1427,6 +1430,13 @@ mod tests { }), "DROP SCHEMA \"analytics\" CASCADE;" ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::Dameng), + name: "analytics".to_string(), + }), + "DROP SCHEMA \"analytics\" CASCADE;" + ); } #[test]