72 lines
4.0 KiB
Java
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"));
|
|
}
|
|
}
|
|
}
|
|
}
|