Czasami zdarza się, że należy utworzyć login z góry zadanym SID-em. Problem tego typu można zaobserwować podczas korzystania z usług Log Shipping’u, AlwaysOn Availability Group czy miroringu. W momencie przełączenia się na serwer zapasowy podczas próby podłączenia się do bazy danych występuje błąd logowania.
Sytuacja taka dotyczy jedynie loginów SQLowych, a nie kont do logowania się do Windows czy też kont z AD.
W sytuacjach opisywanych powyżej zawsze mamy do czynienia z minimum dwoma serwerami SQL. Gdy założymy, że pracujemy z dwoma serwerami to mamy doczynienia z np. SQLServerSource i SQLServerDestination. Na obu tych serwerach zakładamy taki sam login SQLowy: TestSID
Na serwerze źródłowym zakładamy bazę TestDB, a następnie przypisujemy do tej bazy usera z założonego loginu. Uruchamiając od przedstawiony poniżej jesteśmy wstanie odczytać SIDy loginu i usera w bazie TestDB. Oba SIDy powinny być oczywiście takie same.
USE TestDB
GO
SELECT name, sid FROM sys.sysusers
WHERE name = 'TestSID'
GO
USE MASTER
GO
SELECT name, sid
FROM sys.sql_logins WHERE name = 'TestSID'
GO
Kolejny krok to zasymulowanie jednej ze wspomnianych usług np. Logshipping’u. Na serwerze źródłowym wykonujemy backup bazy TestDB i odtwarzamy ją na instancji docelowej.
Kolejny krok to uruchomieniu powyższego skryptu na instancji docelowej.
Jak widać na serwerze docelowym mamy dwa rożne SID-y. Pierwszy SID, który jest taki sam jak na serwerze źródłowym umieszczony jest w bazie, która odtworzyliśmy z backupu lecz nie jest on zgodny z SIDem loginu, który zakładaliśmy na serwerze docelowy.
No i w tym jest problem. SIDy są niezgodne węc pomimo takiej samej nazwy są to dwa różne konta. Mamy efekt osieroconego użytkownika.
Aby zachować zgodność należ na serwerze docelowym wykasować login z niezgodnym SIDem a następnie ponownie założyć login ale ze wskazanym SIDem. Nie można wykonać operacji ALTER.
W tym celu należy wykonać skrypt poniżej:
CREATE Login TestSID
WITH password = 'Pa$$w0rd'
, SID = 0x12D25C0E6667624BB48298DD01735E39
Po założeniu nowego loginu mamy już prawidłowo powiązane konta.