2010-12-01 4 views
6

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

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

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

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

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

ответ

11

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

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

aspnet_regsql -ssremove -E -S.

Примечание:

-E является указать, что вы хотите использовать встроенный разъем безопасности.

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

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

aspnet_regsql -ssadd -sstype р -E -S

Примечание:

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

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

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

Важно:

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

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

1

Для справки, я сделал find a way to do this.

Проблема в том, что 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 
1

Молодцы для нахождения странный путь возможное, чтобы сделать это.

Правильный ответ заключается в следующем:

use master 
go 
EXEC sp_configure 'Cross DB Ownership Chaining', '1'  
go  
RECONFIGURE  
go  
EXEC sp_dboption 'ASPState', 'db chaining', 'true'  
go 
+0

Не пробовал, но обязательно отметьте свой ответ, как принято после тестирования, чтобы проверить. Однако, конечно, мне нравится * смотреть * на то, что вы говорите. – zanlok 2012-07-13 18:38:08

+1

Не удалось найти хранимую процедуру 'sp_dboption'. – 2014-07-03 08:51:09