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