Пример #1
0
        public SqlCommand BuildUpdateColumnCommand(SqlConnection connection, UpdateColumnRequest request)
        {
            var cmd = connection.CreateCommand();

            cmd.CommandType = CommandType.Text;
            cmd.CommandText = $@"UPDATE [{request.SchemaName}].[{request.TableName}] SET
                                 [{request.ColumnName}] = @NewValue
                                 WHERE [{request.ColumnName}] = @OldValue";

            cmd.Parameters.AddWithValue("@OldValue", request.OldValue);
            cmd.Parameters.AddWithValue("@NewValue", request.NewValue);

            return(cmd);
        }
Пример #2
0
        public async Task UpdateColumnAsync(UpdateColumnRequest request)
        {
            var cmd = CommandBuilder.BuildUpdateColumnCommand(Connection, request);

            try
            {
                await Connection.OpenAsync();

                await cmd.ExecuteNonQueryAsync();
            }
            finally
            {
                await Connection.CloseAsync();
            }
        }
Пример #3
0
        public InsertColumnResponse InsertColumn(UpdateColumnRequest columnRequest)
        {
            List <DroppedDependencyDbo> droppedForeignKeys;

            try
            {
                var options = new TransactionOptions()
                {
                    IsolationLevel = System.Transactions.IsolationLevel.Serializable,
                    Timeout        = new TimeSpan(0, TransactionTimeout, 0)
                };
                using (var trScope = new TransactionScope(TransactionScopeOption.Required, options))
                {
                    DataColumnDbo column = InsertColumn(columnRequest.Table, columnRequest.Column, columnRequest.SingleUserMode,
                                                        columnRequest.DisableDependencies, out droppedForeignKeys);
                    int recordCounter = CountRecords(columnRequest.Table);

                    string logMsg = String.Format("Table {0}: inserted column '{1}' [{2}] {3} {4} {5} {6}.", columnRequest.Table,
                                                  columnRequest.Column.Name, columnRequest.Column.SqlDataType, columnRequest.Column.MaximumLength,
                                                  columnRequest.Column.NumericPrecision, columnRequest.Column.NumericScale,
                                                  columnRequest.Column.IsNullable ? "NULL" : "NOT NULL");
                    Guid historyRecordId = LogTableOperation(columnRequest.Table, logMsg, columnRequest.CFC_DB_Major_Version,
                                                             columnRequest.CFC_DB_Minor_Version);

                    trScope.Complete();
                    return(new InsertColumnResponse()
                    {
                        IsSuccess = true,
                        Column = column,
                        DroppedForeignKeys = droppedForeignKeys,
                        RecordCount = recordCounter
                    });
                }
            }
            catch (Exception ex)
            {
                return(new InsertColumnResponse()
                {
                    IsSuccess = false, ErrorMessage = ParseErrorMessage(ex)
                });
            }
        }
Пример #4
0
        public DeleteColumnResponse DeleteColumn(UpdateColumnRequest columnRequest)
        {
            List <DroppedDependencyDbo> droppedDependencies;

            try
            {
                var options = new TransactionOptions()
                {
                    IsolationLevel = System.Transactions.IsolationLevel.Serializable,
                    Timeout        = new TimeSpan(0, TransactionTimeout, 0)
                };
                using (var trScope = new TransactionScope(TransactionScopeOption.Required, options))
                {
                    DeleteColumn(columnRequest.Table, columnRequest.Column.Name, columnRequest.DisableDependencies,
                                 columnRequest.SingleUserMode, out droppedDependencies);
                    var rzlt = new DeleteColumnResponse()
                    {
                        IsSuccess           = true,
                        DroppedDependencies = droppedDependencies,
                        RecordCount         = CountRecords(columnRequest.Table),
                        Column = columnRequest.Column,
                    };

                    string logMsg          = String.Format("Column '{0}' was deleted.", columnRequest.Column.Name);
                    Guid   historyRecordId = LogTableOperation(columnRequest.Table, logMsg, columnRequest.CFC_DB_Major_Version,
                                                               columnRequest.CFC_DB_Minor_Version);

                    trScope.Complete();
                    return(rzlt);
                }
            }
            catch (Exception ex)
            {
                return(new DeleteColumnResponse()
                {
                    IsSuccess = false, ErrorMessage = ParseErrorMessage(ex)
                });
            }
        }
Пример #5
0
        public RenameColumnResponse RenameColumn(UpdateColumnRequest columnRequest)
        {
            List <AlteredDependencyDbo> alteredDependencies;

            try
            {
                var options = new TransactionOptions()
                {
                    IsolationLevel = System.Transactions.IsolationLevel.Serializable,
                    Timeout        = new TimeSpan(0, TransactionTimeout, 0)
                };
                using (var trScope = new TransactionScope(TransactionScopeOption.Required, options))
                {
                    DataColumnDbo column = RenameColumn(columnRequest.Table, columnRequest.OldColumnName, columnRequest.Column.Name,
                                                        columnRequest.SingleUserMode, out alteredDependencies);
                    var rzlt = new RenameColumnResponse()
                    {
                        IsSuccess = true, Column = column
                    };
                    rzlt.AlteredDependencies.AddRange(alteredDependencies);
                    rzlt.RecordCount = CountRecords(columnRequest.Table);

                    string logMsg = String.Format("Name of the column '{0}' was changed to {1}.", columnRequest.OldColumnName,
                                                  columnRequest.Column.Name);
                    Guid historyRecordId = LogTableOperation(columnRequest.Table, logMsg, columnRequest.CFC_DB_Major_Version,
                                                             columnRequest.CFC_DB_Minor_Version);

                    trScope.Complete();
                    return(rzlt);
                }
            }
            catch (Exception ex)
            {
                return(new RenameColumnResponse()
                {
                    IsSuccess = false, ErrorMessage = ParseErrorMessage(ex)
                });
            }
        }
Пример #6
0
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            var tables = await _metadataRepository.GetTablesAsync();

            var foreignKeys = await _metadataRepository.GetForeignKeysAsync();

            foreach (var table in tables)
            {
                if (table.PrimaryKeyType != "uniqueidentifier")
                {
                    continue;
                }

                Console.Write($"Updating {table.Name}  ");

                var stopwatch = Stopwatch.StartNew();

                var references = foreignKeys.Where(x => x.PrimaryTableId == table.Id && x.PrimaryColumnId == table.PrimaryKeyId).ToList();
                await DisableForeignKeys(references);

                var dataRequest = new GetDataRequest
                {
                    SchemaName = table.Schema,
                    TableName  = table.Name,
                    ColumnName = table.PrimaryKeyName
                };

                var data = await _dataRepository.GetDataAsync(dataRequest);

                var(cursorLeft, cursorTop) = Console.GetCursorPosition();
                var count = 0;
                foreach (var id in data)
                {
                    count++;
                    if (count % 50 == 0)
                    {
                        Console.SetCursorPosition(cursorLeft, cursorTop);
                        Console.Write($"{count}");
                    }

                    var newId = SequentialGuid.NewGuid();

                    var updateIdRequest = new UpdateColumnRequest
                    {
                        SchemaName = table.Schema,
                        TableName  = table.Name,
                        ColumnName = table.PrimaryKeyName,
                        OldValue   = id,
                        NewValue   = newId
                    };

                    await _dataRepository.UpdateColumnAsync(updateIdRequest);

                    foreach (var fk in references)
                    {
                        var updateKeyRequest = new UpdateColumnRequest
                        {
                            SchemaName = fk.ForeignSchemaName,
                            TableName  = fk.ForeignTableName,
                            ColumnName = fk.ForeignColumnName,
                            OldValue   = id,
                            NewValue   = newId
                        };

                        await _dataRepository.UpdateColumnAsync(updateKeyRequest);
                    }
                }

                await EnableForeignKeys(references);

                stopwatch.Stop();
                Console.SetCursorPosition(cursorLeft, cursorTop);
                Console.WriteLine($" Done ({stopwatch.Elapsed})");
            }

            _appLifetime.StopApplication();
        }