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")); } } } }