2010-05-04 4 views
0

Как часть моей (новой) методологии управления версиями базы данных, я пишу «сценарий изменений» и хочу, чтобы скрипт изменения вставлял новую строку в таблицу SchemaChangeLog, если скрипт выполнен успешно, или чтобы отменить изменения, если они есть однократное смену скрипта терпит неудачу.Можете ли вы изменить схему SQL DB в транзакции, чтобы узнать, были ли применены все изменения?

Возможно ли изменение схемы в транзакции и только если оно будет зафиксировано, чтобы затем выполнить INSERT?

Например (псевдо-код, я не слишком хорошо с SQL):

SET XACT_ABORT ON 
BEGIN TRANSACTION 
PRINT 'Add Col2 to Table1' 
IF NOT EXIST (SELECT * FROM sys.columns WHERE NAME='Col2' AND object_id=OBJECT_ID('Table1')) 
BEGIN 
    ALTER TABLE [dbo].[Table1] 
    ADD Col2 int NULL 
END 
INSERT INTO SchemaChangeLog(MajorVer, MinorVer, PointVer, ScriptName, AppliedDate) VALUES(N'01', N'01', N'0000', N'update.01.01.0000.sql', GETDATE()) 
COMMIT TRANSACTION 

ответ

1

Если вы хотите, чтобы два действия атомарным, встраивать их в транзакции. Итак, ваши два действия: 1) ALTER TABLE и 2) INSERT INTO SchemaChangeLog. Поэтому ваша BEGIN TRANSACTION должна произойти перед ALTER TABLE, а COMMIT после INSERT.

Как примечание стороны, есть это уже встроенный механизм в SQL Server для отслеживания изменений схемы, она работает из коробки и лучший, что он будет ловить должного изменения, а не только ваш: Event Notifications ,

+0

Хорошо, поэтому я делаю COMMIT после, что имеет смысл. Я просто попробовал это, и техника, похоже, работает. Однако я не понимаю, как здесь помогают события. Я пытаюсь автоматизировать, насколько это возможно, обновление базы данных, когда скрипты проверяются вне контроля версий. –

+0

Я провел кучу экспериментов, и, действительно, вы можете использовать функцию SET XACT_ABORT ON и обернуть изменения вашей схемы в транзакции и просто попытаться выполнить вставку таблицы SchemaChangeLog прямо перед фиксацией, и все будет работать должным образом. Нет необходимости в уведомлении о событиях. Отметьте это как ответ, чтобы не писать собственный ответ (не профессиональный). –

Смежные вопросы