protected void createSchemaChangeCommands(SchemaChangeContext context, ColumnDefinitionChange change, List<DbCommand> commands) { List<String> safeAlterColumnSqls = tryGetSafeAlterColumnSqlsForChange(context, change); if (null != safeAlterColumnSqls && safeAlterColumnSqls.size() > 0) { commands.add(new GenericDbCommands.GenericSqlCommand(db, safeAlterColumnSqls)); } else { commands.add(db.cmdDropColumn(change.getTable(), change.getOldColumn().getName())); commands.add(db.cmdCreateColumn(change.getTable(), change.getNewColumn())); } }
@Override protected List<String> createSafeAlterColumnSqlsForChange(SchemaChangeContext context, ColumnDefinitionChange change) { List<String> sqls = new ArrayList<String>(); if(change.isUniqueChanged()){ sqls.add(getAddUniqueColumnSql(change.getTable(), change.getOldColumn().getName())); if(change.getPropertyChanges().size() > 1){ DbColumn c = new DbColumnBuilder(change.getNewColumn()).setUnique(false).build(); sqls.add(getAlterColumnSql(change.getTable(), c)); } }else{ sqls.add(getAlterColumnSql(change.getTable(), change.getNewColumn())); } return sqls; }
@Override protected List<String> createSafeAlterColumnSqlsForChange(SchemaChangeContext context, ColumnDefinitionChange change) { List<String> sqls = new ArrayList<String>(); if(change.isUniqueChanged()){ sqls.addAll(getAlterColumnUniqueSqls(change.getTable(), change.getOldColumn().getName())); if(change.getPropertyChanges().size() > 1){ DbColumn c = new DbColumnBuilder(change.getNewColumn()).setUnique(false).build(); sqls.add(getAlterColumnSql(change.getTable(), c)); } }else{ sqls.add(getAlterColumnSql(change.getTable(), change.getNewColumn())); } return sqls; }
@Override protected List<String> createSafeAlterColumnSqlsForChange(SchemaChangeContext context, ColumnDefinitionChange change) { List<String> sqls = new ArrayList<String>(); if(change.isUniqueChanged()){ sqls.addAll(getAlterColumnUniqueSqls(change.getTable(), change.getOldColumn().getName())); if(change.getPropertyChanges().size() > 1){ DbColumn c = new DbColumnBuilder(change.getNewColumn()).setUnique(false).build(); sqls.add(getAlterColumnSql(change.getTable(), c)); } }else{ sqls.add(getAlterColumnSql(change.getTable(), change.getNewColumn())); } return sqls; }
@Override protected List<String> createSafeAlterColumnSqlsForChange(SchemaChangeContext context, ColumnDefinitionChange change) { // TODO create safe alter column sqls for change List<String> sqls = new ArrayList<>(); if(change.isUniqueChanged()){ sqls.add(getAddUniqueColumnSql(change.getTable(), change.getOldColumn().getName())); if(change.getPropertyChanges().size() > 1){ DbColumn c = new DbColumnBuilder(change.getNewColumn()).setUnique(false).build(); sqls.add(getAlterColumnSql(change.getTable(), c, change.getOldColumn())); } }else{ sqls.add(getAlterColumnSql(change.getTable(), change.getNewColumn(), change.getOldColumn())); } DbColumn newColumn = change.getNewColumn(); if(!supportsColumnCommentInDefinition() && !Strings.isEmpty(newColumn.getComment())){ sqls.addAll(getCommentOnColumnSqls(change.getTable(),newColumn.getName(),newColumn.getComment())); } return sqls; } protected String getAddUniqueColumnSql(DbSchemaObjectName tableName,String columnName) {
DbColumn n = change.getNewColumn();
DbColumn n = change.getNewColumn();
protected boolean canSafeAlterColumnForChange(SchemaChangeContext context, ColumnDefinitionChange change) { if (change.isTypeChanged()) { return false; } DbColumn o = change.getOldColumn(); DbColumn n = change.getNewColumn(); if (change.isSizeChanged()) { if (n.getLength() < o.getLength()) { return false; } if (n.getPrecision() < o.getPrecision() || n.getScale() < o.getScale()) { return false; } } //null -> not null may be failed if (change.isNullableChanged()) { if (!n.isNullable() && o.isNullable() && !context.isEmptyTable(change.getTable())) { return false; } } //non unique -> unique may be failed. if (change.isUniqueChanged()) { if (n.isUnique() && !o.isUnique() && !context.isEmptyTable(change.getTable())) { return false; } } return true; }