From e4dc5bace85d4f74ede6edefe1e43cf28bb98395 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Thu, 27 Aug 2026 16:25:57 +0800 Subject: [PATCH] fix(core): use drop user cascade for oceanbase oracle schema drop Closes #7351 --- crates/dbx-core/src/db_admin_sql.rs | 33 ++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/src/db_admin_sql.rs b/crates/dbx-core/src/db_admin_sql.rs index e211c2a904..73dd1da4f2 100644 --- a/crates/dbx-core/src/db_admin_sql.rs +++ b/crates/dbx-core/src/db_admin_sql.rs @@ -717,7 +717,10 @@ pub fn build_create_schema_sql(options: SchemaNameSqlOptions) -> Result String { let schema = quote_table_identifier(options.database_type, &options.name); - if matches!( + if options.database_type == Some(DatabaseType::OceanbaseOracle) { + // OceanBase Oracle mode models schemas as users, so dropping one drops the user. + format!("DROP USER {schema} CASCADE;") + } else if matches!( options.database_type, Some(DatabaseType::Postgres | DatabaseType::Gaussdb | DatabaseType::Kwdb | DatabaseType::Dameng) ) { @@ -1895,6 +1898,34 @@ mod tests { }), "DROP SCHEMA \"analytics\" CASCADE;" ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::Postgres), + name: "analytics".to_string(), + }), + "DROP SCHEMA \"analytics\" CASCADE;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::Mysql), + name: "analytics".to_string(), + }), + "DROP SCHEMA `analytics`;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::OceanbaseOracle), + name: "analytics".to_string(), + }), + "DROP USER \"analytics\" CASCADE;" + ); + assert_eq!( + build_drop_schema_sql(SchemaNameSqlOptions { + database_type: Some(DatabaseType::OceanbaseOracle), + name: "ana\"lytics".to_string(), + }), + "DROP USER \"ana\"\"lytics\" CASCADE;" + ); } #[test]