Zawsze myślałem, że użytkownik dbo
jest faktycznym właścicielem bazy danych.
To jest (a przynajmniej powinno być) prawidłowe. Nazwa „dbo” tego użytkownika nigdy się nie zmienia, ale bazowy identyfikator SID zmienia się w zależności od tego, kto utworzył bazę danych lub kto był ustawiony za pomocą sp_changedbowner (chociaż, włącznie z SQL Server 2005) lub ALTER AUTHORIZATION (zaczynając od SQL Serwer 2008).
We wszystkich tych trzech przypadkach rekord w sys.databases
jest również zmieniany, aby były zsynchronizowane. Jednak podczas przywracania bazy danych z innego systemu lub z tej samej instancji, ale z bazy danych, której kopię zapasową utworzono / odłączono przed wykonaniem jednej z tych 2 komend SQL w celu zmiany właściciela, a następnie PRZYWRÓCIĆ lub dołączyć, nastąpi występować niezgodność pomiędzy owner_sid
kolumny sys.databases
i „dbo” sid
w sys.database_principals
tym, że DB.
O ile mi wiadomo, rekord w sys.database_principals
każdej bazie danych jest prawdziwym właścicielem, a owner_sid
kolumna w sys.databases
to kwestia prowadzenia dokumentacji / wygody (podobnie jak w przypadku denormalizacji; bez sys.databases
systemu musiałby tworzyć osobne zapytania dla wszystkich baz danych, aby zdobądź te informacje za każdym razem!) i bezpieczeństwo. Jedną z rzeczy, której się używa, jest identyfikacja potencjalnie szkodliwej / niepoprawnej przywróconej / dołączonej bazy danych, że te rekordy się nie zgadzają. Próba dostępu SQLCLR Zgromadzeń oznaczonych jako albo EXTERNAL_ACCESS
czy UNSAFE
nie będzie ładować jeśli ktoś zdecydował się pójść mniej bezpieczną trasę umożliwiając TRUSTWORTHY
jako że opiera się na „dbo” SID, ponieważ musi pasować do logowania, który ma albo EXTERNAL ACCESS ASSEMBLY
alboUNSAFE ASSEMBLY
pozwolenie. A gdy w SID występuje rozbieżność między tymi dwoma widokami katalogu systemowego, nie można ustalić, którego użyć, i użyć go jako czerwonej flagi, aby wskazać na potencjalny problem bezpieczeństwa. W rzeczywistości testuję ten warunek w skrypcie instalacyjnym dla SQL #, aby ostrzec kogoś, aby dokonał odpowiedniej zmiany, tak aby nie musiał tracić czasu na szukanie go na wypadek, gdyby SQL Server narzekał na to w pewnym momencie.