Почему мои разрешения tempdb reset при перезагрузке сервера?

Последние два раза мы перезагрузили наш сервер sql, наш веб-сайт опустился. Причина заключается в том, что tempdb воссоздается, и пользователь ASPState теряет разрешение на чтение/запись на tempdb (это сайт ASP и данные сеанса хранятся на сервере sql).

Это не было проблемой примерно две недели назад. Кто-нибудь знает, как я могу помешать серверу sql сбросить разрешения tempdb после перезагрузки? Или почему это только начало происходить в последнее время? Мы используем MS SQL Server 2005.

Ответ 1

Во-первых, вы не должны напрямую назначать разрешения для tempdb. По очевидным причинам он воссоздается при каждой перезагрузке.

На самом деле возникает вопрос: почему вам все равно нужны прямые разрешения для этой базы данных?

Вам не нужны никакие разрешения за пределами возможности подключения к серверу sql для создания временных таблиц. Однако, если вы создаете реальные таблицы в tempdb, я настоятельно рекомендую вам изменить это, чтобы использовать для этой цели выделенную базу данных.

UPDATE
Основываясь на комментарии Мартина, все, что я могу сказать, вау. Я бы даже не подумал, что это был бы вариант.

Хорошо, теперь, когда я оправился от шока.

Создайте новое задание на сервере sql, которое выполняется по расписанию. В расписании должно быть установлено значение "Автоматически запускаться при каждом запуске агента SQL Server". Задание должно воссоздать необходимые разрешения tempdb.

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

Ответ 2

Я знаю, что это старый вопрос, но нашел новую информацию о поведении tempdb при перезапуске. Tempdb по существу воссоздан из "модели" db, и именно поэтому все изменения в нем теряются. Если вы внесете изменения, чтобы сохранить свои изменения, даже после перезапуска, сделайте те же изменения в "model" db, что и в "tempdb". Посмотрите на следующее: Обновляется ли tempdb из модели при запуске?

Ответ 3

База данных модели используется в качестве шаблона для TempDB. Добавьте пользователей и разрешения для модели, и те же функции и разрешения будут использоваться в TempDB. Я не говорю, что это оптимальное решение для каждого случая, но оно работало для меня в ситуации, когда для приложения требовался специальный доступ TempDB.

Ответ 4

База данных tempdb на сервере SQL (из всего, что я когда-либо читала, слышала или переживала) полностью удалялась и воссоздавалась каждый раз, когда запускалась служба. Таким образом, все, что хранится внутри или записывается в эту базу данных, включая роли, пользователей или другие параметры прав доступа, будет уничтожено. Запрет на какой-то суетливый код для установки / reset при каждом запуске экземпляра, я не думаю, что вы можете обойти это. (Я не думаю, что что-либо, установленное в базе данных модели, копируется на tempdb, когда оно создается, но я даже не думал об этом...)

Устанавливаются ли такие настройки в эти базы данных? Вы уверены, что ваша система не была недавно изменена или обновлена, чтобы сделать это? Возможно, важно, как часто экземпляр SQL останавливается и перезапускается? (Это не редкость - если не разумно - для SQL работать в течение нескольких месяцев, если не существует без перезагрузки...)

Ответ 5

Создайте запуск script на сервере sql, как показано ниже:

use master
go
drop proc AddAppTempDBOwner
go
create proc AddAppTempDBOwner as
declare @sql varchar(200)
select @sql = 'use tempdb' + char(13)
+ 'exec sp_addrolemember ''db_owner'', ''app'''
exec (@sql)
go
exec sp_procoption 'AddAppTempDBOwner', 'startup', 'true'
go