Почему мои разрешения для базы данных tempdb сбрасываются при перезагрузке сервера? - PullRequest
11 голосов
/ 15 марта 2011

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

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

Ответы [ 6 ]

6 голосов
/ 15 марта 2011

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

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

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

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

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

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

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

3 голосов
/ 10 июня 2015

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

1 голос
/ 27 апреля 2018

Вот скрипт для создания запускаемой хранимой процедуры, которая перебирает Logins и создает Users в tempdb как db_owner Этот скрипт не имеет зашифрованных логинов.

В результате даже после перезапуска машины SQL все логины SQL будут иметь права доступа tempdb .

USE [master]
GO
IF EXISTS ( SELECT *
FROM sysobjects
WHERE  id = object_id(N'AddUsersToTempDb')
    and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE AddUsersToTempDb
END
GO
CREATE PROCEDURE AddUsersToTempDb
AS
DECLARE @loginname as NVARCHAR(100);
DECLARE Login_Cursor CURSOR FOR  
    SELECT loginname
FROM master..syslogins
OPEN Login_Cursor;
FETCH NEXT FROM Login_Cursor INTO @loginname;
WHILE @@FETCH_STATUS = 0  
    BEGIN
    IF (@loginname <> 'sa' AND (NOT @loginname LIKE '##%') AND (NOT @loginname LIKE '%\%'))
    BEGIN
        PRINT @loginname
        IF EXISTS(SELECT * FROM [tempdb].sys.database_principals WHERE type_desc = 'SQL_USER' AND name = @loginname)
        PRINT '  - user already exists'
    ELSE
        BEGIN
            PRINT '  - creating user'
            DECLARE @Sql VARCHAR(MAX)
            SET @Sql =
            'USE Tempdb' + char(13) + 
            'CREATE USER ' + @loginname + ' FOR LOGIN ' + @loginname  + char(13) +
            'EXEC sp_addrolemember db_owner, ' + @loginname
            EXEC (@Sql)
        END
    END
    FETCH NEXT FROM Login_Cursor INTO @loginname;
END;
CLOSE Login_Cursor;
DEALLOCATE Login_Cursor;
GO

EXEC sp_procoption 'AddUsersToTempDb', 'startup', 'true' 
GO
1 голос
/ 31 марта 2014

Создайте скрипт запуска на SQL Server, как показано ниже:

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 
1 голос
/ 30 апреля 2013

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

0 голосов
/ 15 марта 2011

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

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

...