#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).