Сценарий развертывания SQL Server

#asp.net #sql-server #sql-server-2005

#asp.net #sql-сервер #sql-server-2005

Вопрос:

Я использую sql server 2005 для asp.net проект. Я хочу запустить SQL-файл, содержащий все изменения в базе данных с последнего выпуска, чтобы легко довести базу данных до последней версии.

У меня в основном просто есть набор инструкций alter table, create table, create index, alter view, call stored proc и т.д. Но я хотел бы включить это в транзакцию, чтобы в случае сбоя какой-либо ее части ни одно из изменений не выполнялось. В противном случае это могло бы привести к действительно запутанной отладке там, где она завершилась.

Кроме того, если вы знаете лучший способ управлять развертыванием БД, дайте мне знать!

Ответ №1:

Я делаю нечто подобное со сценарием Powershell, используя SMO.

Псевдокод будет:

 $SDB = SourceDBObject
$TDB = TargetDBObject

ForEach $table in $SDB.Tables
{
   Add an entry to a hash table with the name 
   and some attributes (rowcount, columns, datasize)
}

# Same thing for $TDB

# Compare the two arrays, and make a list of all the ones that exist in the source but not in the target, or that are different

# Same thing for Procs and Views

# Pass this list to a SMO.Scripter as an UrnCollection object, and it will script them out in dependency order (it's an option), with drops

# Wrap the script in a transaction and execute it on target server

# Use SQLBulkCopy class to  transfer data server-to-server
  

Ответ №2:

Какую версию Visual Studio вы используете? В Visual Studio 2010 и, насколько я помню, в Visual Studio 2008 — в меню в разделе «Данные» есть два варианта — «Сравнение схемы» и «Сравнение данных». Это должно подтолкнуть вас в правильном направлении.

Ответ №3:

 BEGIN TRANSACTION @TranName;
USE AdventureWorks2008R2;
DELETE FROM AdventureWorks2008R2.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
  

Вы должны выполнить все в рамках транзакции

Ответ №4:

Обратите внимание, что некоторые инструкции DDL должны быть первыми инструкциями в пакете (пакеты отделены от транзакций). (GO является разделителем пакетов по умолчанию в SSMS и SQLCMD).