Автоматизированное поколение сценариев изменения базы данных

Я ищу путь к автоматизированному поколение сценариев изменения для наших баз данных.

В настоящее время мы используем выпуск базы данных Visual Studio 2008, который имеет опцию Schema Compare, но я не вижу путь к автоматизированному те действия.

То, что я хотел бы сделать, создают старое и новую базу данных во время моих ежедневных сборок и имеют схему, выдерживают сравнение, генерируют сценарий изменения для различий между теми двумя. (Различия в схеме и процедурах, справочные таблицы могут быть отброшены и воссозданы без проблем),

Кто-либо знает о решении для, или я собираюсь записать мили сценариев для получения этого движения?

Используя любые заплаченные продукты помимо Microsoft инструменты не являются опцией здесь...

Обновление на основе обратной связи:

  • У меня есть различные базы данных различных размеров, но все изменения произойдут управляемым способом, будучи знающим о данных уже представляет.
  • Только "легкие" изменения должны заботиться об автоволшебно, я думаю дополнение столбцов и (очень распространенных) таблиц. Столбцы никогда не могут удаляться (таким образом, инструмент/сценарий может выступить, происходит ли это),
13
задан thijs 16 February 2010 в 10:26
поделиться

7 ответов

Подобно тому, что делает @Anton Gogolev, мы используем инструмент, который позволяет вам записывать миграции в файлы XML. Используемый нами инструмент называется Liquibase и поддерживает множество различных вариантов СУБД. Мы не только используем его внутри наших схем разработчика, мы также используем его извне во время установки обновления, которую запускает заказчик.

7
ответ дан 1 December 2019 в 22:38
поделиться

Вы можете попробовать немного изменить свой подход.

Я разрабатываю инструмент под названием Wizardby , который позволяет вам записывать миграции баз данных в специальном DSL. Таким образом, вместо того, чтобы полагаться на хрупкие алгоритмы сравнения схем (например, ни один из них не может правильно обрабатывать переименования столбцов / таблиц), вы записываете все изменения в схему своей базы данных в файле mdl , который позже компилируется с помощью Wizardby в платформенно-зависимый SQL. Его также можно интегрировать в процесс сборки.

1
ответ дан 1 December 2019 в 22:38
поделиться
public void doGet(HttpServletRequest request, HttpServletResponse response) {
    String searchString = request.getParameter("searchString");
    // process searchString
}

Декодирование параметра выполняется автоматически.

-121--4716294-

Для квадратичного программирования с Python используется qp -солвер из cvxopt ( источник ). Используя это, легко перевести проблему LCP в проблему QP (см. Википедия ). Пример:

from cvxopt import matrix, spmatrix
from cvxopt.blas import gemv
from cvxopt.solvers import qp

def append_matrix_at_bottom(A, B):
    l = []
    for x in xrange(A.size[1]):
        for i in xrange(A.size[0]):
            l.append(A[i+x*A.size[0]])
        for i in xrange(B.size[0]):
            l.append(B[i+x*B.size[0]])
    return matrix(l,(A.size[0]+B.size[0],A.size[1]))

M = matrix([[ 4.0, 6,   -4,    1.0 ],
            [ 6,   1,    1.0   2.0 ],
            [-4,   1.0,  2.5, -2.0 ],
            [ 1.0, 2.0, -2.0,  1.0 ]])
q = matrix([12, -10, -7.0, 3])

I = spmatrix(1.0, range(M.size[0]), range(M.size[1]))
G = append_matrix_at_bottom(-M, -I)   # inequality constraint G z <= h
h = matrix([x for x in q] + [0.0 for _x in range(M.size[0])])

sol = qp(2.0 * M, q, G, h)      # find z, w, so that w = M z + q
if sol['status'] == 'optimal':
    z = sol['x']
    w = matrix(q)
    gemv(M, z, w, alpha=1.0, beta=1.0)   # w = M z + q
    print(z)
    print(w)
else:
    print('failed')

Обратите внимание:

  • код полностью не проверен, пожалуйста, внимательно проверьте;
  • Есть, безусловно, лучшие методы решения, чем преобразование LCP в QP.
-121--3959373-

Можете ли вы быть более конкретными? Например, насколько велика база данных? Сколько у него данных? Насколько быстрым должно быть модернизация?

Я уверен, что для этой проблемы не существует полностью общего и автоматического решения.

  • Если переименовать столбец и сравнить только схему? Столбец будет удален и создан пустым.

  • Если разделить столбец «Полное имя» на «Имя», «Среднее имя», «SurName». Как сравнивать схему с ней?

Убедитесь, что эти образцы можно продолжить и продолжить.

1
ответ дан 1 December 2019 в 22:38
поделиться

Похоже, что в Power Tools Microsoft® Visual Studio Team System 2008 Database Edition есть SqlSchemaCompareTask. http://www.microsoft.com/downloads/details.aspx?FamilyID=73ba5038-8e37-4c8e-812b-db14ede2c354&displaylang=en

На основе первой версии базы данных Edition, а не в обновленном выпуске GDR2.

2
ответ дан 1 December 2019 в 22:38
поделиться

Функциональность SQL Compare также доступна в виде библиотек и документирована как таковая. Я использовал эти dll в консольном приложении, проблем не было.

1
ответ дан 1 December 2019 в 22:38
поделиться

Как упоминалось в thijs , Database Edition Power Tools содержит SqlSchemaCompareTask, который вы можете использовать из своего кода для создания сценария изменения:

SqlSchemaCompareTask task = new SqlSchemaCompareTask()
{
    SourceConnectionString = "Data Source=source-db; ...",
    SourceDatabaseName = "source-database-name",
    TargetConnectionString = "Data Source=target-db; ...",
    TargetDatabaseName = "target-database-name",
    OutputFileName = "changes.sql",
    OutputPath = @"C:\path\to\output"
};

task.Execute();

Кроме того, вы можете выполнить его с помощью сценария сборки через msbuild.exe :

<Import
    Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\
             Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/>
<Target Name ="SchemaCompare">
    <SqlSchemaCompareTask
        SourceConnectionString="$(SourceConnectionString)"
        SourceDatabaseName="$(TargetDatabase)"
        TargetConnectionString="$(TargetConnectionString)"
        TargetDatabaseName="$(TargetDatabase)"
        OutputPath = "$(IntermediateOutputPath)"
        OutputFileName = "$(TargetDatabase)SchemaCompare.sql"
        IgnoreChecks ="true"/>
</Target>
3
ответ дан 1 December 2019 в 22:38
поделиться

Вот уже 10 лет я использую DbGhost для реализации управления изменениями sql в большинстве консультантов, в которых я работал; это нескончаемый сюрприз по поводу отсутствия управления изменениями SQL, которое могло бы сравниться с тем, что предусмотрено для кода приложения.

Поддержка Innovartis не имеет себе равных в предоставлении помощи в реализации как подхода непрерывной интеграции для поддержки баз данных, так и процесса выпуска и путей обновления. Совсем недавно я применил его к проекту Monorail / nHibernate, над которым я работаю, который генерирует сценарии обновления из нашей модели домена POCO, которая определяет нашу базу данных. Они создаются и применяются с помощью нашей сборки CruiseControl при каждой регистрации.

Более конкретно для вашей ситуации, вы можете указать DbGhost на версию выпуска (v1.0) вашей базы данных и создать сценарий для исходных и статических данных. Затем это можно ввести в систему управления версиями. Это необязательные шаги, но разумная отправная точка.

DbGhost также может сравнивать (и / или создавать) базу данных, созданную из исходной или текущей базы данных (скажем, v1.1), и предоставлять отчет сравнения, сценарий обновления или обновлять целевую базу данных.

Мы используем его для генерации всех сценариев обновления (повтора и отката) для обновления между каждой дельтой.

В течение 10 лет всякий раз, когда я обнаруживал проблему с продуктом, полезные ребята из службы поддержки всегда вежливо указывали либо на ошибку в моем процессе, либо на одну из многих точек расширения в процессе, которые мне нужно использовать, чтобы преодолеть мою проблема. Он, безусловно, обрабатывает удаление столбцов, индексов, данных, абсолютно всего. Настройки позволяют автоматически вносить только простые изменения и могут не работать при предупреждениях или удалении объектов (столбцов / таблиц), все они поддерживаются в файлах настроек xml (у нас есть более подходящие настройки в нашей сборке разработки и более строгие для сборки в реальном времени).

Я бы не рассматривал разработку Sql Server без него, и это произвело революцию в моей разработке SQL.

Если вам нужны более подробные сведения о рекомендуемом процессе или более подробные инструкции, пожалуйста, дайте мне знать.

1
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: