/*
* 参数 fields表示数据表的所有字段的数组类型
* 获取数据表的字段的sql语句见下文
*/
private static CharSequence createUpdateTrriger(String tableName, String[] fields) {
StringBuilder sb = new StringBuilder();
sb.append("create trigger tri_"+tableName+"_update\n"
+ " after UPDATE on " + tableName + "\n"
+ " for each row\n "
+ "begin\n"
+ " insert into " + tableName +"_his"+ "\n"
+ "(" + "id_his");
for(int i = 0 ; i < fields.length ; i++){
if(!"QZKRKSJ".equals(fields[i])&& !"QZKXGSJ".equals(fields[i]) && !"".equals(fields[i])){
sb.append(", "+ "`"+fields[i]+"`");
}
}
sb.append(",htime");//time_trig
sb.append(")\n"
+ "(SELECT REPLACE(UUID(), '-', '')");
for(int i = 0 ; i < fields.length ; i++){
if(!"QZKRKSJ".equals(fields[i])&& !"QZKXGSJ".equals(fields[i]) && !"".equals(fields[i])){
sb.append(",new."+ fields[i]);
}
}
sb.append(",now());\nend; " + "\n" + "\n");
return sb.toString();
}
获取数据表的字段的sql语句:
String sql = "select COLUMN_NAME from information_schema.COLUMNS where table_name ='"+tableName+"'"+"and TABLE_SCHEMA='"+schema+"'";
另外遇到一个关于触发器的隐藏bug
数据库的迁移过程中会携带触发器。触发器创建语句的注释中会带有前期触发器创建的用户名,如图:
迁移后,数据源的用户名发生变化,系统就会报错,找不到原来的用户。
报错:The user specified as a definer (‘用户名’@’%’) does not exist
解决,换掉用户名重新创建触发器。