package liquibase.sqlgenerator.core;
import liquibase.database.Database;
import liquibase.database.core.*;
import liquibase.exception.ValidationErrors;
import liquibase.sql.Sql;
import liquibase.sql.UnparsedSql;
import liquibase.sqlgenerator.SqlGenerator;
import liquibase.sqlgenerator.SqlGeneratorChain;
import liquibase.statement.core.DropPrimaryKeyStatement;
public class DropPrimaryKeyGenerator extends AbstractSqlGenerator<DropPrimaryKeyStatement> {
@Override
public boolean supports(DropPrimaryKeyStatement statement, Database database) {
return (!(database instanceof SQLiteDatabase));
}
public ValidationErrors validate(DropPrimaryKeyStatement dropPrimaryKeyStatement, Database database, SqlGeneratorChain sqlGeneratorChain) {
ValidationErrors validationErrors = new ValidationErrors();
validationErrors.checkRequiredField("tableName", dropPrimaryKeyStatement.getTableName());
if (database instanceof FirebirdDatabase || database instanceof InformixDatabase) {
validationErrors.checkRequiredField("constraintName", dropPrimaryKeyStatement.getConstraintName());
}
return validationErrors;
}
public Sql[] generateSql(DropPrimaryKeyStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {
String sql;
if (database instanceof MSSQLDatabase) {
if (statement.getConstraintName() == null) {
StringBuilder query = new StringBuilder();
query.append("DECLARE @pkname nvarchar(255)");
query.append("\n");
query.append("DECLARE @sql nvarchar(2048)");
query.append("\n");
query.append("select @pkname=i.name from sysindexes i");
query.append(" join sysobjects o ON i.id = o.id");
query.append(" join sysobjects pk ON i.name = pk.name AND pk.parent_obj = i.id AND pk.xtype = 'PK'");
query.append(" join sysindexkeys ik on i.id = ik.id AND i.indid = ik.indid");
query.append(" join syscolumns c ON ik.id = c.id AND ik.colid = c.colid");
query.append(" where o.name = '").append(statement.getTableName()).append("'");
query.append("\n");
query.append("set @sql='alter table ").append(database.escapeTableName(statement.getSchemaName(), statement.getTableName())).append(" drop constraint ' + @pkname");
query.append("\n");
query.append("exec(@sql)");
query.append("\n");
sql = query.toString();
} else {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName());
}
} else if (database instanceof PostgresDatabase) {
if (statement.getConstraintName() == null) {
StringBuilder query = new StringBuilder();
query.append("create or replace function __liquibase_drop_pk(tableName text) returns void as $$");
query.append(" declare");
query.append(" pkname text;");
query.append(" sql text;");
query.append(" begin");
query.append(" pkname = c.conname");
query.append(" from pg_class r, pg_constraint c");
query.append(" where r.oid = c.conrelid");
query.append(" and contype = 'p'");
query.append(" and relname ilike tableName;");
query.append(" sql = 'alter table ' || tableName || ' drop constraint ' || pkname;");
query.append(" execute sql;");
query.append(" end;");
query.append(" $$ language plpgsql;");
query.append(" select __liquibase_drop_pk('").append(statement.getTableName()).append("');");
query.append(" drop function __liquibase_drop_pk(tableName text);");
sql = query.toString();
} else {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName());
}
} else if (database instanceof FirebirdDatabase) {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT "+database.escapeConstraintName(statement.getConstraintName());
} else if (database instanceof OracleDatabase) {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP PRIMARY KEY DROP INDEX";
} else if (database instanceof InformixDatabase) {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP CONSTRAINT " + database.escapeConstraintName(statement.getConstraintName());
} else {
sql = "ALTER TABLE " + database.escapeTableName(statement.getSchemaName(), statement.getTableName()) + " DROP PRIMARY KEY";
}
return new Sql[] {
new UnparsedSql(sql)
};
}
}