Ejemplo n.º 1
0
        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);
        }