Temat: Migracja usera z uprawnieniami
Jeżeli przenosisz bazę na nowy serwer, to użytkownicy i uprawnienia na poziomie bazy pozostaną po jej przywróceniu na nową maszynę. Należy natomiast wygenerować skrypty tworzące loginy na starym serwerze i uruchomić je na nowym:
SELECT 'IF(SUSER_ID('+QUOTENAME(SP.name,'''')+') IS NULL)BEGIN CREATE LOGIN '+QUOTENAME(SP.name)+
CASE WHEN SP.type_desc = 'SQL_LOGIN'
THEN ' WITH PASSWORD = '+CONVERT(NVARCHAR(MAX),SL.password_hash,1)+' HASHED'
ELSE ' FROM WINDOWS'
END + ';/*'+SP.type_desc+'*/ END;'
COLLATE SQL_Latin1_General_CP1_CI_AS -- ustawiamy taki collate, jako mamy na serwerze
FROM sys.server_principals AS SP
LEFT JOIN sys.sql_logins AS SL
ON SP.principal_id = SL.principal_id
WHERE SP.type_desc IN ('SQL_LOGIN','WINDOWS_GROUP','WINDOWS_LOGIN')
AND SP.name NOT LIKE '##%##'
AND SP.name NOT IN ('SA');
Po utworzeniu loginów na nowym serwerze trzeba jeszcze powiązać loginy sql server z użytkownikami w bazie. Jeżeli użytkownicy i loginy mają takie same nazwy, to można je powiązać za pomocą poniższego skryptu:
use przywrócona_baza
DECLARE @Username varchar(100), @cmd varchar(100)
DECLARE userLogin_cursor CURSOR FAST_FORWARD
FOR
SELECT UserName = name FROM sysusers
WHERE issqluser = 1 and (sid IS NOT NULL AND sid <> 0×0)
AND suser_sname(sid) IS NULL
ORDER BY name
FOR READ ONLY
OPEN userLogin_cursor
FETCH NEXT FROM userLogin_cursor INTO @Username
WHILE @@fetch_status = 0
BEGIN
SET @cmd = ‘ALTER USER ‘+@username+‘ WITH LOGIN ‘+@username
EXECUTE(@cmd)
FETCH NEXT FROM userLogin_cursor INTO @Username
END
CLOSE userLogin_cursor
DEALLOCATE userLogin_cursor
Jeżeli użytkownicy i loginy posiadają różne nazwy to trzeba ich powiązać samodzielnie:
ALTER user_z_bazy WITH LOGIN przeniesiony_login