Это:
use test;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRANSACTION;
EXEC sp_RENAME 'table1.asd' , 'ads', 'COLUMN';
INSERT INTO table1 (ads) VALUES (12);
COMMIT
- простой пример, демонстрирующий, что я хотел бы сделать.
Я хочу каким-то образом изменить таблицу и выполнить вставки / удаления в одной транзакции(или другие изменения в таблице).
Проблема в том, что результаты из sp_RENAME
никогда не видны сразу оператору INSERT
.Я играл с разными уровнями изоляции транзакции - она всегда одна и та же (поэтому транзакция никогда не фиксируется).
Обычно я просто использовал бы операторы GO, чтобы это было в отдельных пакетах, но мне нужно это в одном пакете, потому что ...
Моя настоящая задача - написать скрипт, который добавляет в таблицу идентификатор и FK (для этого требуется создать другую таблицу с новой схемой, выполнить вставку идентификатора из старой, переименовать таблицу иприменение ограничений).Мне нужно быть осторожным - если какая-то часть процедуры не удалась, я должен откатить всю транзакцию.Вот почему я хотел сделать что-то вроде этого:
BEGIN TRAN
--some statement
IF (@@ERROR <> 0) GOTO ERR_HANDLER
-- some other statement
IF (@@ERROR <> 0) GOTO ERR_HANDLER
COMMIT TRAN
RETURN 0
ERR_HANDLER:
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
RETURN 1
Поскольку ярлыки работают только внутри пакета, я не могу использовать операторы GO.
Так как я могу:
- операторы make (т. Е. ALTER TABLE, sp_RENAME) имеют немедленный эффект?
или
- написать целое решение другим способом, чтобы было безопасноработать в производственной БД?