public virtual string Alter(Alter alter, SqlOptions sql) { var statement = $"ALTER TABLE {sql.IdentifieName(alter.Table)} "; switch (alter.WhatToModify) { case WhatToAlter.PrimaryKey: var columnPK = sql.IdentifieName(alter.Column); foreach (var c in alter.ExtraPrimaryKeyColumns) { columnPK += $",{sql.IdentifieName(c)}"; } statement += alter.AlterType == AlterType.Add ? $"ADD CONSTRAINT {sql.SafeIdentifieName(alter.ConstraintName)} PRIMARY KEY ({columnPK})" : "DROP PRIMARY KEY"; break; case WhatToAlter.ForeignKey: statement += alter.AlterType == AlterType.Add ? $"ADD CONSTRAINT {sql.SafeIdentifieName(alter.ConstraintName)} FOREIGN KEY ({alter.Column}) REFERENCES " + $"{sql.IdentifieName(alter.ReferencesTable)}({sql.IdentifieName(alter.ReferencesColumn)})" : $"DROP FOREIGN KEY {sql.SafeIdentifieName(alter.ConstraintName)}"; break; case WhatToAlter.Unique: statement += alter.AlterType == AlterType.Add ? $"ADD CONSTRAINT {sql.SafeIdentifieName(alter.ConstraintName)} UNIQUE ({alter.Column})" : "DROP INDEX KEY"; break; case WhatToAlter.Column: switch (alter.AlterType) { case AlterType.Add: statement += $"ADD {alter.NewColumnToAdd.ToString(sql)}"; break; case AlterType.Drop: statement += $"DROP COLUMN {sql.IdentifieName(alter.Column)}"; break; case AlterType.Alter: statement += $"MODIFY COLUMN {sql.IdentifieName(alter.Column)} " + $"{sql.CSharpTypeToSqlDataType(alter.DataTypeToAlter, alter.DataTypeSizeToAlter, alter.DataTypeDigitsToAlter)}"; break; } break; } return(statement); }