Как часть моей (новой) методологии управления версиями базы данных, я пишу «сценарий изменений» и хочу, чтобы скрипт изменения вставлял новую строку в таблицу 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
Хорошо, поэтому я делаю COMMIT после, что имеет смысл. Я просто попробовал это, и техника, похоже, работает. Однако я не понимаю, как здесь помогают события. Я пытаюсь автоматизировать, насколько это возможно, обновление базы данных, когда скрипты проверяются вне контроля версий. –
Я провел кучу экспериментов, и, действительно, вы можете использовать функцию SET XACT_ABORT ON и обернуть изменения вашей схемы в транзакции и просто попытаться выполнить вставку таблицы SchemaChangeLog прямо перед фиксацией, и все будет работать должным образом. Нет необходимости в уведомлении о событиях. Отметьте это как ответ, чтобы не писать собственный ответ (не профессиональный). –