45 lines
2.5 KiB
Java
45 lines
2.5 KiB
Java
import java.io.FileInputStream;
|
|
import java.sql.*;
|
|
import java.util.Properties;
|
|
|
|
public class FkSummary {
|
|
public static void main(String[] args) throws Exception {
|
|
Properties props = new Properties();
|
|
try (FileInputStream in = new FileInputStream(args[0])) { props.load(in); }
|
|
try (Connection conn = DriverManager.getConnection(props.getProperty("url"), props.getProperty("username"), props.getProperty("password"))) {
|
|
System.out.println("== FK count by parent table ==");
|
|
try (Statement st = conn.createStatement();
|
|
ResultSet rs = st.executeQuery(
|
|
"SELECT OBJECT_NAME(parent_object_id) AS tbl, COUNT(*) AS fk_cnt " +
|
|
"FROM sys.foreign_keys GROUP BY parent_object_id ORDER BY tbl")) {
|
|
while (rs.next()) System.out.printf("%-22s %d%n", rs.getString("tbl"), rs.getInt("fk_cnt"));
|
|
}
|
|
System.out.println("== tables WITH FKs: " + "see above" + " ==");
|
|
try (Statement st = conn.createStatement();
|
|
ResultSet rs = st.executeQuery("SELECT COUNT(DISTINCT parent_object_id) FROM sys.foreign_keys")) {
|
|
rs.next(); System.out.println("tables_with_fk=" + rs.getInt(1));
|
|
}
|
|
try (Statement st = conn.createStatement();
|
|
ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM sys.tables")) {
|
|
rs.next(); System.out.println("total_tables=" + rs.getInt(1));
|
|
}
|
|
// self-referencing FKs
|
|
try (Statement st = conn.createStatement();
|
|
ResultSet rs = st.executeQuery(
|
|
"SELECT name FROM sys.foreign_keys WHERE parent_object_id = referenced_object_id")) {
|
|
System.out.println("== self-referencing FKs ==");
|
|
while (rs.next()) System.out.println(" " + rs.getString("name"));
|
|
}
|
|
// composite FKs (more than one column)
|
|
try (Statement st = conn.createStatement();
|
|
ResultSet rs = st.executeQuery(
|
|
"SELECT fk.name, COUNT(*) AS cols FROM sys.foreign_keys fk " +
|
|
"JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id " +
|
|
"GROUP BY fk.name HAVING COUNT(*) > 1")) {
|
|
System.out.println("== composite FKs (multi-column) ==");
|
|
while (rs.next()) System.out.printf(" %s (%d cols)%n", rs.getString("name"), rs.getInt("cols"));
|
|
}
|
|
}
|
|
}
|
|
}
|