Автоматическое исправление ошибки базы данных tempdb, связанной с «ASPStateTempSessions» - PullRequest
6 голосов
/ 01 декабря 2010

В соответствии с этим практическим руководством я успешно настроил IIS на своем устройстве разработки XP-SP3 для SQL Server 2008 Express для сохранения информации о состоянии сеанса ASP.NET. Я просто использую SQL Server, потому что в противном случае при каждой перекомпиляции я терял состояние сеанса, что было неприятно (пришлось заново входить в систему). Но я сталкиваюсь с досадной проблемой, заключающейся в том, что каждый раз, когда я перезапускаю SQL, появляется эта ошибка, а иногда и один или два других очень похожих друга:

The SELECT permission was denied on the object 'ASPStateTempSessions',
database 'tempdb', schema 'dbo'.

Чтобы исправить ошибку, я просто открываю Management Studio и редактирую User Mapping для имени входа / dbo, которое я использую на ASPState db, и повторно добавляю tempdb этому пользователю со всеми разрешениями, кроме запрета. Очевидно, что при наличии необходимых разрешений ASP.NET может автоматически создавать таблицы, которые он использует. Он просто не может запустить этот CreateTempTables sproc, пока не появится нужная защита.

ВОПРОС ... Есть ли способ не повторять это при каждом перезапуске SQL Server?

Мне сейчас все равно, нужно ли сохранять временные данные при перезапусках, но мне бы не хотелось проходить этот шаг вручную, чтобы заставить мое веб-приложение работать на localhost, который использует переменные состояния сеанса повсюду. Я полагаю, что можно было бы прибегнуть к какой-то хранимой процедуре в SQL Server, чтобы выполнить задачу для этой машины при запуске службы, чтобы не приходилось делать это вручную. Я бы принял такой ответ как быстрое решение. Но я также предполагаю, что есть лучшая рекомендуемая конфигурация или что-то в этом роде. Не вижу ответа на этот вопрос в руководстве с инструкциями или в другом месте здесь, в StackOverflow.

Ответы [ 3 ]

13 голосов
/ 16 ноября 2012

Оба ответа кажутся действительными; но с большинством вещей Microsoft, все в настройке ...

Сначала удалите базу данных ASPState с помощью команды:

aspnet_regsql –ssremove –E -S.

Примечание:

-E означает, что вы хотите использовать встроенное защищенное соединение.

-S сообщает, какой сервер SQL и экземпляр SQL использовать, и "." (точка) указывает локальный экземпляр по умолчанию

Затем переустановите с помощью команды:

aspnet_regsql –ssadd –sstype p –E -S.

Примечание:

Стиль имеет три варианта, т | р | c ... первая буква "t" указывает программе установки разместить все хранимые процедуры в базе данных ASPState и все данные в базе данных tempdb. Второй параметр «p» указывает установщику сохранить данные в базе данных ASPState. Последний параметр «c» позволяет указать другую «пользовательскую» базу данных для сохранения данных состояния сеанса.

Если вы переустанавливаете с помощью «-sstype p», вам нужно только предоставить datareader / datawriter в базу данных ASPState для пользователя, который устанавливает соединение (в большинстве случаев это идентификатор пула приложений в IIS).

Дополнительным преимуществом сохранения данных является то, что состояние сеанса сохраняется даже после перезапуска службы. Единственный недостаток заключается в том, что вы должны убедиться, что задание очистки агента регулярно удаляет старые сеансы (это выполняется по умолчанию каждую минуту).

Важно:

Если вы работаете в кластере, вы должны сохранить данные сеанса. Вы можете использовать только sstype 'p' или 'c'.

Надеюсь, что это проливает свет на проблему!

1 голос
/ 13 июля 2012

Хорошо сделано, чтобы найти самый странный способ сделать это.

Правильный ответ таков:

use master
go  
EXEC sp_configure 'Cross DB Ownership Chaining', '1'    
go    
RECONFIGURE    
go    
EXEC sp_dboption 'ASPState', 'db chaining', 'true'    
go
1 голос
/ 04 февраля 2011

Для записи я нашел способ сделать это .

Проблема в том, что база данных tempdb воссоздается из модели db при каждом перезапуске службы.Суть решения состоит в том, чтобы создать хранимую процедуру, выполняющую эту работу, а затем запустить ее при запуске.

Исходный код (ссылка на ссылку выше) выглядит следующим образом:

use master
go

-- remove an old version
drop proc AddAppTempDBOwner
go

-- the sp
create proc AddAppTempDBOwner as
declare @sql varchar(200)
select @sql = 'use tempdb' + char(13) + 'exec sp_addrolemember ''db_owner'', ''app'''
exec (@sql)
go

-- add it to the startup
exec sp_procoption 'AddAppTempDBOwner', 'startup', 'true'
go
...