У меня установлены два сервера Windows Server 2008, на обоих работает SQL Server 2008 R2. Одна используется как основная БД, другая как резервное зеркало (две БД веб-сайтов + ASPState для сеансов). Все работает отлично, пока одна из БД не станет основной после перезагрузки сервера, на котором она работает. Я получаю такую ошибку:
Invalid object name 'tempdb.dbo.ASPStateTempSessions'.
Я могу решить эту проблему, запустив хранимую процедуру ASPState_Startup
(который выполняет ASPState.dbo.CreateTempTables
), но только если БД является «главным» состоянием. Когда сервер перезагружается, он всегда возвращается к БД в состоянии «Зеркало / Восстановление», что означает, что я не могу запустить этот SP при запуске.
Любые предложения о том, как я могу обойти эту проблему?
Попробуйте настроить задание агента SQL, которое запускается в каждом экземпляре каждую минуту и выполняет сценарий для поиска базы данных в не восстанавливаемом состоянии, проверяет таблицу и затем выполняет процедуру, если она не существует. Я взял имена объектов из вашего вопроса, поэтому их может потребоваться изменить, если они не в вашей среде.
if exists ( select 1 from sys.databases where state_desc <> 'RESTORING' and
[name] = 'ASPState' )
begin
if ( object_id('tempdb.dbo.ASPStateTempSessions') is null )
begin
exec sp_executesql @stmt = N'exec ASPState.dbo.CreateTempTables'
end
end