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

86 lines
4.2 KiB
Java

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;
public class FkCheck {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
try (FileInputStream in = new FileInputStream(args[0])) {
props.load(in);
}
String url = props.getProperty("url");
String user = props.getProperty("username");
String pass = props.getProperty("password");
System.out.println("Connecting to: " + url);
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
try (Connection conn = DriverManager.getConnection(url, user, pass)) {
System.out.println("CONNECTED: " + conn.getMetaData().getDatabaseProductName()
+ " " + conn.getMetaData().getDatabaseProductVersion());
// 1. Total FK count
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM sys.foreign_keys")) {
rs.next();
System.out.println("TOTAL_FK_COUNT=" + rs.getInt(1));
}
// 2. FK status summary (disabled / not trusted / not for replication)
System.out.println("--- FK STATUS ---");
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(
"SELECT name, is_disabled, is_not_trusted, is_not_for_replication, create_date " +
"FROM sys.foreign_keys ORDER BY name")) {
while (rs.next()) {
System.out.printf("FK=%s disabled=%s not_trusted=%s not_for_repl=%s created=%s%n",
rs.getString("name"), rs.getBoolean("is_disabled"),
rs.getBoolean("is_not_trusted"), rs.getBoolean("is_not_for_replication"),
rs.getTimestamp("create_date"));
}
}
// 3. FK delete/update actions
System.out.println("--- FK ACTIONS ---");
String actSql =
"SELECT fk.name, OBJECT_NAME(fk.parent_object_id) AS parent_table, " +
" fk.delete_referential_action_desc AS del_action, " +
" fk.update_referential_action_desc AS upd_action " +
"FROM sys.foreign_keys fk ORDER BY parent_table, fk.name";
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(actSql)) {
while (rs.next()) {
System.out.printf("%s (%s): ON DELETE %s, ON UPDATE %s%n",
rs.getString("name"), rs.getString("parent_table"),
rs.getString("del_action"), rs.getString("upd_action"));
}
}
// 4. FK details: parent/child columns
System.out.println("--- FK DETAILS ---");
String sql =
"SELECT fk.name AS fk_name, " +
" OBJECT_NAME(fk.parent_object_id) AS parent_table, " +
" OBJECT_NAME(fk.referenced_object_id) AS ref_table, " +
" pc.name AS parent_col, rc.name AS ref_col, fkc.constraint_column_id AS ord " +
"FROM sys.foreign_keys fk " +
"JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id " +
"JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fkc.parent_column_id " +
"JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fkc.referenced_column_id " +
"ORDER BY parent_table, fk.name, ord";
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) {
System.out.printf("%s: %s(%s) -> %s(%s)%n",
rs.getString("fk_name"), rs.getString("parent_table"),
rs.getString("parent_col"), rs.getString("ref_table"),
rs.getString("ref_col"));
}
}
}
}
}