fix(sidebar): support dropping schema for Dameng database
This commit is contained in:
1 parent
a6a072294a
commit
75238cde35
2 files changed
+29
-4
No files matched your search
@@ -90,6 +90,7 @@ import {
|
|||||||
supportsTableStructureEditing,
|
supportsTableStructureEditing,
|
||||||
supportsTransfer,
|
supportsTransfer,
|
||||||
usesTreeSchemaMode,
|
usesTreeSchemaMode,
|
||||||
|
isSingleDatabase,
|
||||||
} from "@/lib/database/databaseCapabilities";
|
} from "@/lib/database/databaseCapabilities";
|
||||||
import { copyNameForTreeNode, isDocumentBrowserTreeNode, objectSourceKindForTreeNode, shouldRunTreeNodeRowAction, treeNodeRowAction, treeNodeRowDoubleClickAction } from "@/lib/sidebar/treeNodeClick";
|
import { copyNameForTreeNode, isDocumentBrowserTreeNode, objectSourceKindForTreeNode, shouldRunTreeNodeRowAction, treeNodeRowAction, treeNodeRowDoubleClickAction } from "@/lib/sidebar/treeNodeClick";
|
||||||
import { dataTabOpenModeFromTreeClick, type DataTabOpenMode } from "@/lib/sidebar/dataTabOpenPolicy";
|
import { dataTabOpenModeFromTreeClick, type DataTabOpenMode } from "@/lib/sidebar/dataTabOpenPolicy";
|
||||||
@@ -2290,7 +2291,8 @@ const canCreateSchema = computed(() => {
|
|||||||
|
|
||||||
const canDropSchema = computed(() => {
|
const canDropSchema = computed(() => {
|
||||||
const config = activeNode.value.connectionId ? connectionStore.getConfig(activeNode.value.connectionId) : undefined;
|
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(() => {
|
const canEditSchemaComment = computed(() => {
|
||||||
@@ -2949,17 +2951,30 @@ async function confirmDropSchema() {
|
|||||||
if (!node.connectionId || !node.database) return;
|
if (!node.connectionId || !node.database) return;
|
||||||
try {
|
try {
|
||||||
await connectionStore.ensureConnected(node.connectionId);
|
await connectionStore.ensureConnected(node.connectionId);
|
||||||
|
const config = connectionStore.getConfig(node.connectionId);
|
||||||
|
const dbType = effectiveDatabaseTypeForConnection(config);
|
||||||
const sql =
|
const sql =
|
||||||
dropSchemaPreviewSql.value ||
|
dropSchemaPreviewSql.value ||
|
||||||
(await buildDropSchemaSql({
|
(await buildDropSchemaSql({
|
||||||
databaseType: databaseTypeForNode(node),
|
databaseType: databaseTypeForNode(node),
|
||||||
name: node.label,
|
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);
|
toast(t("contextMenu.dropSchemaSuccess", { name: node.label }), 3000);
|
||||||
const config = connectionStore.getConfig(node.connectionId);
|
|
||||||
if (config?.db_type === "sqlserver") {
|
if (config?.db_type === "sqlserver") {
|
||||||
await connectionStore.loadSqlServerDatabaseObjects(node.connectionId, node.database, { force: true });
|
await connectionStore.loadSqlServerDatabaseObjects(node.connectionId, node.database, { force: true });
|
||||||
|
} else if (isSingleDatabase(dbType)) {
|
||||||
|
await connectionStore.loadDatabases(node.connectionId, { force: true });
|
||||||
} else {
|
} else {
|
||||||
await connectionStore.loadSchemas(node.connectionId, node.database, { force: true });
|
await connectionStore.loadSchemas(node.connectionId, node.database, { force: true });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -587,7 +587,10 @@ pub fn build_create_schema_sql(options: SchemaNameSqlOptions) -> Result<String,
|
|||||||
|
|
||||||
pub fn build_drop_schema_sql(options: SchemaNameSqlOptions) -> String {
|
pub fn build_drop_schema_sql(options: SchemaNameSqlOptions) -> String {
|
||||||
let schema = quote_table_identifier(options.database_type, &options.name);
|
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;")
|
format!("DROP SCHEMA {schema} CASCADE;")
|
||||||
} else {
|
} else {
|
||||||
format!("DROP SCHEMA {schema};")
|
format!("DROP SCHEMA {schema};")
|
||||||
@@ -1427,6 +1430,13 @@ mod tests {
|
|||||||
}),
|
}),
|
||||||
"DROP SCHEMA \"analytics\" CASCADE;"
|
"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]
|
#[test]
|
||||||
|
|||||||
Reference in new issue
Block a user