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

151 lines
8.8 KiB
Java

import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
public class LogRebuild {
static final String ALLOW = "ISNULL(CONVERT(int, SESSION_CONTEXT(N'allow_g3soft')), 0) = 1";
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"))) {
conn.setAutoCommit(false);
// 1. drop views referencing log tables
run(conn, "IF OBJECT_ID('dbo.v_s_log_audit') IS NOT NULL DROP VIEW dbo.v_s_log_audit");
run(conn, "IF OBJECT_ID('dbo.v_s_log_technical') IS NOT NULL DROP VIEW dbo.v_s_log_technical");
run(conn, "IF OBJECT_ID('dbo.v_s_log_login') IS NOT NULL DROP VIEW dbo.v_s_log_login");
// 2. drop tables
run(conn, "DROP TABLE dbo.s_log_audit_field");
run(conn, "DROP TABLE dbo.s_log_audit");
run(conn, "DROP TABLE dbo.s_log_technical");
run(conn, "DROP TABLE dbo.s_log_login");
// 3. recreate with b_id first
run(conn,
"CREATE TABLE dbo.s_log_login (\n" +
" b_id bigint NOT NULL,\n" +
" b_user_id bigint NULL,\n" +
" b_account varchar(50) NULL,\n" +
" b_login_type varchar(20) NOT NULL,\n" +
" b_login_result int NOT NULL CONSTRAINT DF_s_log_login_result DEFAULT (0),\n" +
" b_fail_reason nvarchar(200) NULL,\n" +
" b_ip varchar(50) NULL,\n" +
" b_ip_location nvarchar(200) NULL,\n" +
" b_browser varchar(100) NULL,\n" +
" b_browser_version varchar(50) NULL,\n" +
" b_os varchar(100) NULL,\n" +
" b_os_version varchar(50) NULL,\n" +
" b_device_type varchar(20) NULL,\n" +
" b_user_agent nvarchar(max) NULL,\n" +
" b_session_id varchar(50) NULL,\n" +
" b_request_id varchar(64) NULL,\n" +
" b_trace_id varchar(64) NULL,\n" +
" b_occurdatetime datetime2 NULL CONSTRAINT DF_s_log_login_occur DEFAULT (sysutcdatetime()),\n" +
" CONSTRAINT PK_s_log_login PRIMARY KEY (b_id)\n" +
");");
run(conn, "CREATE INDEX IX_s_log_login_user ON dbo.s_log_login (b_user_id, b_occurdatetime DESC)");
run(conn, "CREATE INDEX IX_s_log_login_account ON dbo.s_log_login (b_account, b_occurdatetime DESC)");
run(conn, "CREATE INDEX IX_s_log_login_result ON dbo.s_log_login (b_login_result, b_occurdatetime DESC)");
run(conn,
"CREATE TABLE dbo.s_log_technical (\n" +
" b_id bigint NOT NULL,\n" +
" b_user_id bigint NULL,\n" +
" b_account varchar(50) NULL,\n" +
" b_sourcetype varchar(20) NULL,\n" +
" b_loglevel varchar(16) NOT NULL,\n" +
" b_logcategory varchar(64) NULL,\n" +
" b_operation varchar(100) NULL,\n" +
" b_module_code varchar(50) NULL,\n" +
" b_request_id varchar(64) NULL,\n" +
" b_trace_id varchar(64) NULL,\n" +
" b_server_node varchar(128) NULL,\n" +
" b_duration_ms bigint NULL,\n" +
" b_result_code varchar(50) NULL,\n" +
" b_error_code varchar(50) NULL,\n" +
" b_error_message nvarchar(2000) NULL,\n" +
" b_exception_text nvarchar(max) NULL,\n" +
" b_context_text nvarchar(max) NULL,\n" +
" b_occurdatetime datetime2 NULL CONSTRAINT DF_s_log_technical_occur DEFAULT (sysutcdatetime()),\n" +
" CONSTRAINT PK_s_log_technical PRIMARY KEY (b_id)\n" +
");");
run(conn, "CREATE INDEX IX_s_log_technical_trace ON dbo.s_log_technical (b_trace_id, b_occurdatetime DESC)");
run(conn, "CREATE INDEX IX_s_log_technical_level ON dbo.s_log_technical (b_loglevel, b_occurdatetime DESC)");
run(conn,
"CREATE TABLE dbo.s_log_audit (\n" +
" b_id bigint NOT NULL,\n" +
" b_event_code varchar(50) NOT NULL,\n" +
" b_module_code varchar(50) NULL,\n" +
" b_data_id varchar(50) NULL,\n" +
" b_business_no varchar(50) NULL,\n" +
" b_operation varchar(100) NULL,\n" +
" b_operator_id bigint NULL,\n" +
" b_operator_name nvarchar(100) NULL,\n" +
" b_source_type varchar(20) NOT NULL CONSTRAINT DF_s_log_audit_source DEFAULT ('user'),\n" +
" b_visibility varchar(20) NOT NULL CONSTRAINT DF_s_log_audit_visibility DEFAULT ('internal'),\n" +
" b_request_id varchar(64) NULL,\n" +
" b_trace_id varchar(64) NULL,\n" +
" b_payload_text nvarchar(max) NULL,\n" +
" b_occurdatetime datetime2 NULL CONSTRAINT DF_s_log_audit_occur DEFAULT (sysutcdatetime()),\n" +
" CONSTRAINT PK_s_log_audit PRIMARY KEY (b_id)\n" +
");");
run(conn, "CREATE INDEX IX_s_log_audit_module ON dbo.s_log_audit (b_module_code, b_data_id, b_occurdatetime DESC)");
run(conn, "CREATE INDEX IX_s_log_audit_trace ON dbo.s_log_audit (b_trace_id)");
run(conn,
"CREATE TABLE dbo.s_log_audit_field (\n" +
" b_id bigint NOT NULL,\n" +
" b_event_id bigint NOT NULL,\n" +
" b_module_code varchar(50) NULL,\n" +
" b_data_id varchar(50) NULL,\n" +
" b_field varchar(50) NOT NULL,\n" +
" b_field_label nvarchar(100) NULL,\n" +
" b_before_value nvarchar(max) NULL,\n" +
" b_after_value nvarchar(max) NULL,\n" +
" b_before_display nvarchar(500) NULL,\n" +
" b_after_display nvarchar(500) NULL,\n" +
" b_visibility varchar(20) NOT NULL CONSTRAINT DF_s_log_audit_field_visibility DEFAULT ('internal'),\n" +
" CONSTRAINT PK_s_log_audit_field PRIMARY KEY (b_id)\n" +
");");
run(conn, "CREATE INDEX IX_s_log_audit_field_event ON dbo.s_log_audit_field (b_event_id)");
run(conn, "CREATE INDEX IX_s_log_audit_field_customer ON dbo.s_log_audit_field (b_module_code, b_data_id, b_visibility, b_event_id)");
// 4. recreate views
run(conn, "CREATE VIEW dbo.v_s_log_login AS SELECT * FROM dbo.s_log_login WHERE b_account <> N'g3soft' OR " + ALLOW);
run(conn, "CREATE VIEW dbo.v_s_log_technical AS SELECT * FROM dbo.s_log_technical WHERE b_account <> N'g3soft' OR " + ALLOW);
run(conn, "CREATE VIEW dbo.v_s_log_audit AS SELECT * FROM dbo.s_log_audit WHERE b_operator_id IN (SELECT b_id FROM dbo.v_b_user) OR " + ALLOW);
conn.commit();
System.out.println("COMMITTED.");
// verify
for (String t : new String[]{"s_log_login", "s_log_technical", "s_log_audit", "s_log_audit_field"}) {
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(
"SELECT c.column_id, c.name FROM sys.columns c WHERE c.object_id=OBJECT_ID('" + t + "') ORDER BY c.column_id")) {
rs.next();
System.out.printf(" %-22s col1=[%d]%s PK=%s%n", t, rs.getInt(1), rs.getString(2),
hasPk(conn, t));
}
}
for (String v : new String[]{"v_s_log_login", "v_s_log_technical", "v_s_log_audit"}) {
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT TOP 1 1 FROM " + v)) {
System.out.println("VIEW OK: " + v);
}
}
}
}
static boolean hasPk(Connection conn, String tbl) throws SQLException {
try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(
"SELECT COUNT(*) FROM sys.key_constraints WHERE parent_object_id=OBJECT_ID('" + tbl + "') AND type='PK'")) {
rs.next(); return rs.getInt(1) > 0;
}
}
static void run(Connection conn, String sql) throws SQLException {
try (Statement st = conn.createStatement()) { st.execute(sql); }
System.out.println("OK: " + sql.replaceAll("\\s+", " ").trim().substring(0, Math.min(80, sql.replaceAll("\\s+", " ").trim().length())));
}
}