This repository was archived by the owner on Nov 3, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathgenTriggerSql.java
More file actions
148 lines (129 loc) · 5.63 KB
/
genTriggerSql.java
File metadata and controls
148 lines (129 loc) · 5.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import java.sql.*;
import java.util.Arrays;
/**
* Created by goforu on 2016/3/1.
*/
public class GenTriggerSql {
private static String DATABASE_URL = "databae_url";//Set databse url
private static String DATABASE_NAME = "name";//database name
private static String DATABASE_PASSWORD = "password";//database password
private static String HISTORY_TABLE = "tbl_history";
private static String HISTORY_TABLE_COLUMN = "action_result";
private static String[] FILTER_COLUMNS = {};//Set your filter columns, changes will be ignored
public static void main(String[] args) {
try {
Connection con = null;
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection(DATABASE_URL + "?allowMultiQueries=true", DATABASE_NAME, DATABASE_PASSWORD);
//Retrive table columns
DatabaseMetaData md = con.getMetaData();
ResultSet rst = md.getTables(null, null, "%", null);
Statement stmt;
stmt = con.createStatement();
stmt.execute(genCreateHistoryTable());//Create history table
while (rst.next()) {
if (rst.getString("TABLE_NAME").equals(HISTORY_TABLE_COLUMN))
continue;
stmt.execute(genDropTriggerSql(rst.getString("TABLE_NAME") + "_u"));//Delete 'update' trigger
stmt.execute(genDropTriggerSql(rst.getString("TABLE_NAME") + "_d"));//Delete 'delete' trigger
genTrigger(stmt, rst.getString("TABLE_NAME"));//Create trigger
}
} catch (Exception e) {
System.out.print("MYSQL ERROR:" + e.getMessage());
}
}
/**
* generate 'create table' sql
*
* @return
*/
private static String genCreateHistoryTable() {
String sqlExe = "DROP TABLE IF EXISTS " + HISTORY_TABLE + ";\n" +
"CREATE TABLE " + HISTORY_TABLE + "(id BIGINT PRIMARY KEY AUTO_INCREMENT, action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, " + HISTORY_TABLE_COLUMN + " VARCHAR(5000));";
System.out.println(sqlExe);
return sqlExe;
}
/**
* Create Triggers
*
* @param stmt
* @param tableName
* @throws SQLException
*/
private static void genTrigger(Statement stmt, String tableName) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tableName);
ResultSetMetaData rsmd = rs.getMetaData();
String sqlUExe = genUTriggerSql(tableName, rsmd);
System.out.print(sqlUExe);
stmt.execute(sqlUExe);
String sqlDExe = genDTriggerSql(tableName, rsmd);
System.out.print(sqlDExe);
stmt.execute(sqlDExe);
}
private static String genDropTriggerSql(String triggerName) {
String sqlExe = "DROP TRIGGER IF EXISTS " + triggerName + ";";
System.out.println(sqlExe);
return sqlExe;
}
/**
* Generate 'update trigger' sql
*
* @param originTable
* @param rsmd
* @return
* @throws SQLException
*/
private static String genUTriggerSql(String originTable, ResultSetMetaData rsmd) throws SQLException {
String sqlexe = "CREATE TRIGGER " + originTable + "_u AFTER UPDATE ON " + originTable + " FOR EACH ROW \n" +
"BEGIN \n" +
"IF ";
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
if (Arrays.asList(FILTER_COLUMNS).contains(rsmd.getColumnName(i)))//filter condition
continue;
sqlexe += genExeConditionSql(rsmd.getColumnName(i)) + "OR ";
}
sqlexe += "false THEN \n" +
"INSERT INTO " + HISTORY_TABLE + " (" + HISTORY_TABLE_COLUMN + ") \n" +
"VALUES( " +
"CONCAT(CONCAT('Update@" + originTable + ":',NEW.id,'|||'),";
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
// if (Arrays.asList(FILTER_COLUMNS).contains(rsmd.getColumnName(i)))//filter record
// continue;
sqlexe += genItemUpdateSql(rsmd.getColumnName(i)) + ",";
}
sqlexe += "'') );\n" +
"END IF;\n" +
"END;\n";
return sqlexe;
}
/**
* Generate 'delete trigger' sql
*
* @param originTable
* @param rsmd
* @return
* @throws SQLException
*/
private static String genDTriggerSql(String originTable, ResultSetMetaData rsmd) throws SQLException {
String sqlexe = "CREATE TRIGGER " + originTable + "_d BEFORE DELETE ON " + originTable + " FOR EACH ROW \n" +
"BEGIN \n" +
"INSERT INTO " + HISTORY_TABLE + " (" + HISTORY_TABLE_COLUMN + ") \n" +
"VALUES( " +
"CONCAT(CONCAT('Delete@" + originTable + ":',OLD.id,'|||')";
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
sqlexe += genItemDeleteSql(rsmd.getColumnName(i));
}
sqlexe += ") );\n" +
"END;\n";
return sqlexe;
}
private static String genExeConditionSql(String targetColumn) {
return "(OLD." + targetColumn + " IS NOT NULL AND NOT OLD." + targetColumn + " <=>'' AND NOT OLD." + targetColumn + " <=> NEW." + targetColumn + ") ";
}
private static String genItemUpdateSql(String targetColumn) {
return "IF(NOT OLD." + targetColumn + " <=> NEW." + targetColumn + ",CONCAT_WS('->',CONCAT('" + targetColumn + "::',IFNULL(OLD." + targetColumn + ",'')),CONCAT(IFNULL(NEW." + targetColumn + ",''),'|'))" + ",'')";
}
private static String genItemDeleteSql(String targetColumn) {
return ",CONCAT(CONCAT('" + targetColumn + "::',IFNULL(OLD." + targetColumn + ",'')),'|')";
}
}