T-SQL - Как я могу скопировать базу данных и сохранить настройки безопасности без изменений? - PullRequest
2 голосов
/ 18 ноября 2011

У меня есть база данных SQL 2005 Express с безопасностью, настроенной для аутентификации Windows на моей машине разработки.Иногда мне нужно скопировать его на тестовый сервер SQL 2008 R2, который использует аутентификацию SQL.Я попытался отсоединить и прикрепить копию разработки на тестовом сервере, а также восстановить резервную копию разработки на тестовом сервере, но в обоих случаях членство в роли учетной записи SQL и ранее настроенные разрешения были потеряны, и мне пришлось перенастроитьих.

Есть ли способ скопировать базу данных на тестовый сервер и сохранить существующую конфигурацию безопасности пользователя SQL без изменений после восстановления / присоединения?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

Возможно, вы столкнулись с проблемой, известной как «Сиротские пользователи», , которая обсуждается в этой статье Mircosoft .

По сути, пользователь существует в базе данных, и имя входа существует на сервере, но идентификаторы SPID не совпадают, поэтому пользователь не связан с именем входа, когда база данных восстановлена ​​или подключена к серверу.

Как обсуждалось в статье, хранимая процедура sp_change_users_login может использоваться для разрешения отдельных имен входа, а следующий сценарий попытается автоматически исправить всех пользователей в базе данных:

IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id('tempdb..#t_users'))
    drop table #t_users

CREATE TABLE #t_users ( [name] SYSNAME)

INSERT #t_users ( [name] )
SELECT [name] 
FROM sysusers 
WHERE 
    islogin = 1 
    AND name NOT IN ('dbo', 'public', 'guest', 'sys', 'INFORMATION_SCHEMA')  
order by name

DECLARE @lc_name SYSNAME

SET @lc_name = (SELECT MIN([name]) FROM #t_users)
WHILE @lc_name IS NOT NULL
BEGIN
    IF EXISTS(SELECT * FROM master..syslogins WHERE [name] = @lc_name)
    BEGIN
        EXEC sp_change_users_login 'AUTO_FIX', @lc_name
        PRINT 'fixing ' + @lc_name
    END
    ELSE
        PRINT '*** not fixing ' + @lc_name

    SET @lc_name = (SELECT MIN([name]) FROM #t_users WHERE [name] > @lc_name )
END
2 голосов
/ 18 ноября 2011

Sure: В графическом интерфейсе SSMS есть быстрый и простой способ копирования пользователей: «Задачи», «Создание сценариев», выберите «пользователи».

Вот еще одна альтернатива:

http://support.microsoft.com/default.aspx?scid=kb;en-us;246133

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...