From 24998425fcc669b107b621802f083cf2c53b09a8 Mon Sep 17 00:00:00 2001 From: Stephan Date: Wed, 29 May 2019 09:19:29 +0200 Subject: [PATCH] Better handling of default constraints --- .../DeleteDefaultConstraintBuilder.cs | 5 +++-- .../Expressions/DeleteDefaultConstraintExpression.cs | 9 +++++---- .../Persistence/SqlSyntax/ISqlSyntaxProvider.cs | 12 +++++++++--- .../Persistence/SqlSyntax/SqlCeSyntaxProvider.cs | 5 +++-- .../Persistence/SqlSyntax/SqlServerSyntaxProvider.cs | 7 ++++--- .../Persistence/SqlSyntax/SqlSyntaxProviderBase.cs | 2 +- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs index 86b90b9d6d..92bc11b04d 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/DefaultConstraint/DeleteDefaultConstraintBuilder.cs @@ -28,9 +28,10 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.DefaultConstraint /// public IExecutableBuilder OnColumn(string columnName) { - var defaultConstraint = _context.SqlContext.SqlSyntax.GetDefaultConstraint(_context.Database, Expression.TableName, columnName); - Expression.ConstraintName = defaultConstraint ?? string.Empty; Expression.ColumnName = columnName; + Expression.HasDefaultConstraint = _context.SqlContext.SqlSyntax.TryGetDefaultConstraint(_context.Database, Expression.TableName, columnName, out var constraintName); + Expression.ConstraintName = constraintName ?? string.Empty; + return new ExecutableBuilder(Expression); } } diff --git a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs index 294190c766..b73d3f0d13 100644 --- a/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs +++ b/src/Umbraco.Core/Migrations/Expressions/Delete/Expressions/DeleteDefaultConstraintExpression.cs @@ -11,15 +11,16 @@ namespace Umbraco.Core.Migrations.Expressions.Delete.Expressions public virtual string TableName { get; set; } public virtual string ColumnName { get; set; } public virtual string ConstraintName { get; set; } + public virtual bool HasDefaultConstraint { get; set; } protected override string GetSql() { - return ConstraintName.IsNullOrWhiteSpace() - ? string.Empty - : string.Format(SqlSyntax.DeleteDefaultConstraint, + return HasDefaultConstraint + ? string.Format(SqlSyntax.DeleteDefaultConstraint, SqlSyntax.GetQuotedTableName(TableName), SqlSyntax.GetQuotedColumnName(ColumnName), - SqlSyntax.GetQuotedName(ConstraintName)); + SqlSyntax.GetQuotedName(ConstraintName)) + : string.Empty; } } } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs index 39419021e0..55625ff04e 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/ISqlSyntaxProvider.cs @@ -108,12 +108,18 @@ namespace Umbraco.Core.Persistence.SqlSyntax IEnumerable> GetDefinedIndexes(IDatabase db); /// - /// Gets the name of the default constraint on a column. + /// Tries to gets the name of the default constraint on a column. /// /// The database. /// The table name. /// The column name. - /// The name of the default constraint, or the empty string if there is no default constraint. - string GetDefaultConstraint(IDatabase db, string tableName, string columnName); + /// The constraint name. + /// A value indicating whether a default constraint was found. + /// + /// Some database engines (e.g. SqlCe) may not have names for default constraints, + /// in which case the function may return true, but is + /// unspecified. + /// + bool TryGetDefaultConstraint(IDatabase db, string tableName, string columnName, out string constraintName); } } diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs index bb91a83da4..cb4b7a5176 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlCeSyntaxProvider.cs @@ -133,13 +133,14 @@ ORDER BY TABLE_NAME, INDEX_NAME"); } /// - public override string GetDefaultConstraint(IDatabase db, string tableName, string columnName) + public override bool TryGetDefaultConstraint(IDatabase db, string tableName, string columnName, out string constraintName) { // cannot return a true default constraint name (does not exist on SqlCe) // but we won't really need it anyways - just check whether there is a constraint + constraintName = null; var hasDefault = db.Fetch(@"select column_hasdefault from information_schema.columns where table_name=@0 and column_name=@1", tableName, columnName).FirstOrDefault(); - return hasDefault ? "XXXXX" : string.Empty; + return hasDefault; } public override bool DoesTableExist(IDatabase db, string tableName) diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs index b0f95b0c56..fab7526a6b 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlServerSyntaxProvider.cs @@ -226,14 +226,15 @@ order by T.name, I.name"); } /// - public override string GetDefaultConstraint(IDatabase db, string tableName, string columnName) + public override bool TryGetDefaultConstraint(IDatabase db, string tableName, string columnName, out string constraintName) { - return db.Fetch(@"select con.[name] as [constraintName] + constraintName = db.Fetch(@"select con.[name] as [constraintName] from sys.default_constraints con join sys.columns col on con.object_id=col.default_object_id join sys.tables tbl on col.object_id=tbl.object_id where tbl.[name]=@0 and col.[name]=@1;", tableName, columnName) - .FirstOrDefault() ?? string.Empty; + .FirstOrDefault(); + return !constraintName.IsNullOrWhiteSpace(); } public override bool DoesTableExist(IDatabase db, string tableName) diff --git a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs index 210d8e4cf1..0c27ac2d50 100644 --- a/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs +++ b/src/Umbraco.Core/Persistence/SqlSyntax/SqlSyntaxProviderBase.cs @@ -223,7 +223,7 @@ namespace Umbraco.Core.Persistence.SqlSyntax public abstract IEnumerable> GetDefinedIndexes(IDatabase db); - public abstract string GetDefaultConstraint(IDatabase db, string tableName, string columnName); + public abstract bool TryGetDefaultConstraint(IDatabase db, string tableName, string columnName, out string constraintName); public virtual bool DoesTableExist(IDatabase db, string tableName) {