2015-02-24 2 views
0

Я написал сценарий миграции данных, в котором я проверяю, выполняется ли предыдущая миграция данных, затем закройте все соединения db, это среднее изменение режима базы данных, которое является , режимом RESTRICTED_USER от donig, поэтому моя база данных будет работать в режиме ограниченного доступа, и после изменения режима базы данных я обновляю свой колонтитул, и после этого я восстанавливаю db в многопользовательском режиме.Оператор ALTER DATABASE не допускается в транзакции с несколькими операциями

Но когда я запускаю его, me следующая ошибка

Msg 6401, Level 16, Состояние 1, Процедура SP_CollegeMigration, Строка 234
Не удается откат CollegeMigration. Не найдено ни одной транзакции или точки сохранения этого имени.

Msg 226, уровень 16, состояние 6, процедура SP_CollegeMigration, строка 236
Оператор ALTER DATABASE не допускается в рамках транзакции с несколькими операциями.

Msg 50000, уровень 16, состояние 6, процедура SP_CollegeMigration, строка 260
Оператор ALTER DATABASE не допускается в рамках транзакции с несколькими операциями.

Это часть моего сценария

IF(@preMigrationStatus = 'InProcess' and @isForceFull = 'Yes') 
BEGIN 
/*if the previous migration is in process then inside if i am changing the 
db mode to restricted_user mode 
*/ 
SET IMPLICIT_TRANSACTIONS OFF 
ALTER DATABASE AlAhsaan2014 SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE; 

UPDATE TblCollegeMigrationHistory 
SET MigrationStatus ='Failed', 
    Comments = Comments + 'Migration Failed at '+ Convert(nvarchar, getdate()) + ' ;' 
WHERE HistoryID = @HistoryId; 

ALTER DATABASE AlAhsaan2014 SET MULTI_USER WITH ROLLBACK IMMEDIATE; 
SET IMPLICIT_TRANSACTIONS ON 
/* select statement goes here */ 

END 
+3

[Плохие привычки пинать: использование JOIN в старом стиле] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins. aspx) - то, что старый стиль * разделенный запятыми список таблиц * style должен ** больше не использоваться **, и вместо этого рекомендуется использовать ** соответствующий ANSI JOIN ** синтаксис, введенный с ANSI - ** 92 * * Стандарт SQL (более ** 20 лет ** назад) –

+1

Отделите свои номера выписок 'GO' – DavidG

+0

, почему мой вопрос был проголосован? –

ответ

0

Я решил эту проблему путем создания нового storedprocedure и поместить эти две строки в процедуру

SET IMPLICIT_TRANSACTIONS OFF 
ALTER DATABASE AlAhsaan2014 SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE; 

, а затем вызвать StoredProcedure из мой сценарий

IF(@preMigrationStatus = 'InProcess' and @isForceFull = 'Yes') 
BEGIN 
/*if the previous migration is in process then inside if i am changing the 
db mode to restricted_user mode 
*/ 

exec sp_changeDbMode 

UPDATE TblCollegeMigrationHistory 
SET MigrationStatus ='Failed', 
    Comments = Comments + 'Migration Failed at '+ Convert(nvarchar, getdate()) + ' ;' 
WHERE HistoryID = @HistoryId; 

ALTER DATABASE AlAhsaan2014 SET MULTI_USER WITH ROLLBACK IMMEDIATE; 
SET IMPLICIT_TRANSACTIONS ON 
/* select statement goes here */ 

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