Я хочу создать несколько хранимых процедур (или пользовательских функций) внутри транзакции.CREATE PROCEDURE
оператор должен быть единственным оператором в пакете, поэтому я должен использовать следующий шаблон:
BEGIN TRANSACTION MyTransaction
USE MyDatabase
GO
CREATE PROCEDURE A
AS
-- The body of procedure A
GO
CREATE PROCEDURE B
AS
-- The body of procedure B
GO
CREATE PROCEDURE C
AS
-- The body of procedure C
GO
COMMIT TRANSACTION MyTransaction
Проблема возникает, если в одном из пакетов возникает ошибка.Например, если ошибка возникает во время создания процедуры B , MyTransaction
с процедурами A и B будет отменен.Но скрипт продолжит работать.Таким образом, будет создана процедура C .
Также невозможно пропустить инструкцию, используя проверку счетчика GOTO
и @@error
, поскольку она не может перейти к метке вне пакетав котором находится GOTO
.
Как предотвратить изменения базы данных при возникновении ошибки?