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