Можете ли вы изменить схему БД SQL в транзакции, чтобы узнать, все ли изменения были применены? - PullRequest
0 голосов
/ 05 мая 2010

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

Возможно ли внести изменения в схему в транзакции, и только если она будет зафиксирована, выполнить 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 голос
/ 05 мая 2010

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

В качестве примечания, в SQL Server уже есть встроенный механизм для отслеживаниясхема меняется, она работает «из коробки», и самое лучшее, что она поймает всех изменений, а не только ваших: Уведомления о событиях .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...