Files
workspace/code/fms/.tmp-fkcheck/UserMigrate.java
T
2026-08-21 23:06:56 +08:00

72 lines
4.0 KiB
Java

import java.io.FileInputStream;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.sql.*;
import java.util.Properties;
public class UserMigrate {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
try (FileInputStream in = new FileInputStream(args[0])) { props.load(in); }
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
try (Connection conn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password"))) {
// 1. backup b_user data to file (INSERT statements)
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM b_user");
PrintWriter w = new PrintWriter("backup_b_user.sql", StandardCharsets.UTF_8)) {
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
w.println("-- b_user backup: " + new Timestamp(System.currentTimeMillis()));
while (rs.next()) {
StringBuilder colsSql = new StringBuilder();
StringBuilder vals = new StringBuilder();
for (int i = 1; i <= cols; i++) {
if (i > 1) { colsSql.append(", "); vals.append(", "); }
colsSql.append("[").append(meta.getColumnName(i)).append("]");
Object v = rs.getObject(i);
if (v == null) vals.append("NULL");
else if (v instanceof Number || v instanceof Boolean) vals.append(v);
else vals.append("N'").append(String.valueOf(v).replace("'", "''")).append("'");
}
w.println("INSERT INTO [dbo].[b_user] (" + colsSql + ") VALUES (" + vals + ");");
}
System.out.println("Backup written: backup_b_user.sql (" + cols + " cols)");
}
// 2. migrate: PK drop -> add identity col -> drop old -> rename -> rebuild PK
conn.setAutoCommit(false);
String[] stmts = {
"ALTER TABLE [dbo].[b_user] DROP CONSTRAINT [PK_b_user]",
"ALTER TABLE [dbo].[b_user] ADD [b_id_new] bigint identity(1,1) NOT NULL",
"ALTER TABLE [dbo].[b_user] DROP COLUMN [b_id]",
"EXEC sp_rename 'dbo.b_user.b_id_new', 'b_id', 'COLUMN'",
"ALTER TABLE [dbo].[b_user] ADD CONSTRAINT [PK_b_user] PRIMARY KEY ([b_id])"
};
for (String s : stmts) {
try (Statement st = conn.createStatement()) { st.execute(s); System.out.println("OK: " + s); }
catch (SQLException e) { conn.rollback(); System.err.println("FAILED: " + e.getMessage() + "\n SQL: " + s); return; }
}
conn.commit();
System.out.println("COMMITTED.");
// 3. verify
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT b_id, b_account, b_name FROM b_user ORDER BY b_id")) {
System.out.println("== b_user after migration ==");
while (rs.next()) System.out.printf(" b_id=%s b_account=%s b_name=%s%n",
rs.getString("b_id"), rs.getString("b_account"), rs.getString("b_name"));
}
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(
"SELECT is_identity FROM sys.columns WHERE object_id=OBJECT_ID('b_user') AND name='b_id'")) {
rs.next(); System.out.println("b_user.b_id is_identity=" + rs.getBoolean("is_identity"));
}
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(
"SELECT name FROM sys.key_constraints WHERE parent_object_id=OBJECT_ID('b_user') ORDER BY name")) {
System.out.println("== b_user constraints ==");
while (rs.next()) System.out.println(" " + rs.getString("name"));
}
}
}
}