86 lines
4.2 KiB
Java
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"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|