protected override IEnumerable <Command> OnCreate(IMetadata sourceMetadata, IMetadata targetMetadata, IComparerContext context) { var command = new Command(); command.Append($"ALTER TABLE {RelationName.AsSqlIndentifier()}"); if (!SqlHelper.IsImplicitIntegrityConstraintName(ConstraintName)) { command.Append($" ADD CONSTRAINT {ConstraintName.AsSqlIndentifier()}"); } else { command.Append(" ADD"); } switch (RelationConstraintType) { case RelationConstraintType.Check: command.Append($" {Triggers[0].TriggerSource}"); break; case RelationConstraintType.NotNull: break; case RelationConstraintType.ForeignKey: case RelationConstraintType.PrimaryKey: case RelationConstraintType.Unique: { var fields = Index .Segments .OrderBy(s => s.FieldPosition) .Select(s => s.FieldName); command.Append($" {RelationConstraintType.ToDescription()} ({string.Join(", ", fields)})"); if (RelationConstraintType == RelationConstraintType.ForeignKey) { var referenceConstraint = sourceMetadata.MetadataConstraints.ReferenceConstraintsByName[ConstraintName]; var referenceRelationConstraint = referenceConstraint.RelationConstraintUq; var primaryKeyFields = referenceRelationConstraint .Index .Segments .OrderBy(s => s.FieldPosition) .Select(s => s.FieldName); command .AppendLine() .Append($" REFERENCES {referenceRelationConstraint.RelationName} ({string.Join(", ", primaryKeyFields)})"); if (referenceConstraint.UpdateRule != ConstraintRule.Restrict) { command .AppendLine() .Append($" ON UPDATE {referenceConstraint.UpdateRule.ToDescription()}"); } if (referenceConstraint.DeleteRule != ConstraintRule.Restrict) { command .AppendLine() .Append($" ON DELETE {referenceConstraint.DeleteRule.ToDescription()}"); } if (referenceConstraint.UpdateRule != ConstraintRule.Restrict || referenceConstraint.DeleteRule != ConstraintRule.Restrict) { command.AppendLine(); } } command.Append(AddConstraintUsingIndex(sourceMetadata, targetMetadata, context)); break; } default: throw new ArgumentOutOfRangeException($"Unknown relation constraint type: {RelationConstraintType}."); } yield return(command); }
protected override IEnumerable <Command> OnDrop(IMetadata sourceMetadata, IMetadata targetMetadata, IComparerContext context) { yield return(new Command() .Append($"ALTER TABLE {RelationName.AsSqlIndentifier()} DROP CONSTRAINT {ConstraintName.AsSqlIndentifier()}")); }