Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Szczegóły
| Atrybut | Wartość |
|---|---|
| Nazwa produktu | SQL Server |
| Identyfikator zdarzenia | 4064 |
| Źródło zdarzenia | MSSQLSERVER |
| Składnik | SQLEngine |
| Nazwa symboliczna | DB_UFAIL_FATAL |
| Tekst wiadomości | Nie można otworzyć domyślnej bazy danych użytkownika. Logowanie nie powiodło się. |
Wyjaśnienie
Logowanie do programu SQL Server nie mogło nawiązać połączenia z programem SQL Server, albo z powodu problemów z uprawnieniami użytkownika bazy danych skojarzonego z logowaniem w domyślnej bazie danych lub problem z domyślną bazą danych.
Problemy z uprawnieniami mogą być następujące:
- Nazwa logowania nie ma odpowiedniego zamapowanego użytkownika w domyślnej bazie danych.
- Do logowania przypisano domyślną bazę danych, ale nie utworzono mapowania użytkownika w określonej bazie danych.
- Zamapowany użytkownik logowania nie uzyskał dostępu. (Na przykład może się to zdarzyć, jeśli użytkownik jest przypadkowo dodany do db_denydatareader stałej roli bazy danych).
Domyślna baza danych może być niedostępna w momencie połączenia z następujących powodów:
- Domyślna baza danych jest w trybie podejrzanego.
- Domyślna baza danych już nie istnieje.
- Domyślna nazwa bazy danych nie jest poprawna.
- Domyślna baza danych jest w trybie pojedynczego użytkownika, a jedyne dostępne połączenie jest już używane przez kogoś innego.
- Domyślna baza danych została odłączona.
- Domyślna baza danych jest ustawiona na stan RESTRICTED_USER.
- Domyślna baza danych jest w trybie offline.
- Domyślna baza danych jest ustawiona na stan AWARYJNY.
- Domyślna baza danych jest częścią dublowania bazy danych.
Ponadto konto logowania może być członkiem wielu grup, a domyślna baza danych dla jednej z tych grup jest niedostępna w momencie połączenia.
Aby uzyskać więcej informacji na temat użytkowników bazy danych w programie SQL Server, zobacz Tworzenie użytkownika bazy danych.
Akcja użytkownika
Możesz wykonać jedną z następujących akcji:
Obejście problemu
Jeśli nie musisz uzyskiwać dostępu do aktualnie skonfigurowanej domyślnej bazy danych i wystarczy połączyć się z wystąpieniem programu SQL Server dla innych operacji przy użyciu programu SQL Server Management Studio (SSMS), wykonaj następujące kroki:
Otwórz program SQL Server Management Studio (SSMS).
W Eksploratorze obiektów wybierz pozycję Połącz>aparat bazy danych.
Wypełnij okno dialogowe Łączenie z serwerem .
Wybierz Opcje .
W obszarze Właściwości połączenia zmodyfikuj wartość Połącz z bazą danych przy użyciu jednej z następujących opcji:
Jeśli identyfikator logowania jest członkiem roli sysadmin, wprowadź ,
mastera następnie wybierz pozycję Połącz , aby nawiązać połączenie z programem SQL Server. Po pomyślnym nawiązaniu połączenia z programem SQL Server możesz zmienić domyślną bazę danych na inną, która jest obecnie dostępna na stronie Ogólne właściwości logowania w programie SSMS. Więcej informacji można znaleźć w artykule Utworzenie logowania.Jeśli identyfikator logowania nie jest członkiem roli administratora systemu, wprowadź nazwę bazy danych na serwerze, do którego masz dostęp. Alternatywnie możesz spróbować wprowadzić nazwę systemowej bazy danych, taką jak
master, a następnie wybrać pozycję Połącz. Ten krok może nie działać, jeśli administrator systemu jawnie odmówił uprawnień użytkownikowi-gościowimasterw bazie danych. W tym scenariuszu musisz współpracować z administratorem systemu, aby rozwiązać ten problem.
Rozwiązywanie problemu
Administrator systemu może sprawdzić bieżącą domyślną bazę danych użytkownika przy użyciu następującego zapytania:
SELECT name, default_database_name
FROM sys.server_principals
WHERE type = 'S' AND name = '<sql-login>';
Skorzystaj z poniższej tabeli, aby określić odpowiednią akcję w celu rozwiązania problemu ze skojarzonymi przyczynami:
| Przyczyna | Resolution |
|---|---|
| Żadne mapowanie użytkownika nie istnieje w domyślnej bazie danych logowania lub użytkownik nie uzyskał dostępu. | Ci użytkownicy bazy danych są również nazywani użytkownikami oddzielonym. Ten problem występuje zwykle, gdy bazy danych są przenoszone między dwoma wystąpieniami serwera i jest jedną z typowych przyczyn błędu 4064. Aby wykryć oddzielonych użytkowników i rozwiązać ten problem, zobacz Rozwiązywanie problemów z oddzielonych użytkownikami (SQL Server). |
| Użytkownik bazy danych nie istnieje na potrzeby logowania | Utwórz użytkownika bazy danych i przypisz odpowiednie uprawnienia, aby uzyskać dostęp do bazy danych. |
| Konto użytkownika bazy danych odmówiło uprawnień dostępu do bazy danych | Przejdź do właściwości użytkownika w bazie danych (Rozwiń węzeł > Bazy danych Użytkownicy zabezpieczeń>) i sprawdź, czy użytkownik jest częścią roli db_denydatareader na stronie Członkostwo. Możesz również sprawdzić obowiązujące uprawnienia użytkownika przy użyciu sys.fn_my_permissions. |
| Domyślna baza danych jest w trybie podejrzanego. | Baza danych może być podejrzana z kilku powodów. Możliwe przyczyny to odmowa dostępu do zasobu bazy danych przez system operacyjny oraz niedostępność lub uszkodzenie co najmniej jednego pliku bazy danych. Stan bazy danych można sprawdzić przy użyciu następującego zapytania: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';. W programie SSMS stan podejrzanych baz danych jest wyświetlany jako (Oczekiwanie na odzyskiwanie). Aby rozwiązać tę sytuację, może być konieczne odzyskanie bazy danych z jej kopii zapasowej. |
| Nieprawidłowa nazwa bazy danych w parametrach połączenia | Podczas próby nawiązania połączenia z bazą danych, która nie istnieje, może zostać wyświetlony następujący komunikat o błędzie:Cannot open database "AdventureWorks" requested by the login. The login failed.System zarządzania bazami danych (DBMS) może również wyświetlać Login failed for user CONTOSO\user1 komunikat o błędzie. Aby uzyskać więcej informacji, zobacz MSSQLSERVER_18456.Dziennik błędów programu SQL Server będzie miał następujący komunikat: "Logowanie użytkownika 'CONTOSO\User1' nie powiodło się. Przyczyna: Nie można otworzyć jawnie określonej bazy danych "AdventureWorks". Aby rozwiązać ten błąd, upewnij się, że nazwa bazy danych jest taka sama zarówno w komunikacie o błędzie, jak i wpisie dziennika błędów. Zmień parametry połączenia, jeśli są nieprawidłowe lub przyznaj użytkownikowi wymagane uprawnienia. |
| Domyślna baza danych już nie istnieje. | Jeśli celowo usunięto bazę danych z serwera, zmień domyślną bazę danych logowania na inną istniejącą bazę danych na serwerze przy użyciu programu SSMS lub instrukcji ALTER LOGIN (Transact-SQL). Opcjonalnie możesz sprawdzić, czy na serwerze znajdują się inne identyfikatory logowania, których domyślna baza danych jest ustawiona na tę nieistnieną bazę danych, używając następującego zapytania: SELECT name AS Login_Name FROM sys.server_principals where default_database_name = '<removed-dbname>';. |
| Domyślna baza danych jest w trybie pojedynczego użytkownika, a jedyne połączenie jest używane przez administratora lub inną osobę. | Jeśli baza danych jest ustawiona na tryb pojedynczego użytkownika na potrzeby konserwacji, należy ustawić ją z powrotem na tryb wielu użytkowników po zakończeniu działania konserwacji, używając następującego zapytania: ALTER DATABASE <dbname> SET MULTI_USER;.Aby uzyskać więcej informacji, zobacz Ustawianie bazy danych na tryb pojedynczego użytkownika. Uwaga: Aby sprawdzić, czy baza danych jest w trybie pojedynczego użytkownika, możesz użyć tego zapytania: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.Jeśli nadal musisz ograniczyć dostęp do bazy danych, ale chcesz włączyć łączność dla danych logowania, których dotyczy problem, zmień domyślną bazę danych na inną bazę danych na serwerze. |
| Domyślna baza danych została odłączona. | Odłączanie bazy danych usuwa ją z wystąpienia programu SQL Server i nie jest już dostępne. Aby udostępnić je do logowania, dołącz bazę danych przy użyciu programu SSMS lub procedury składowanej sp_attach_db . Aby uzyskać więcej informacji, zobacz Odłączanie i dołączanie bazy danych (SQL Server). |
| Domyślna baza danych została ustawiona na stan RESTRICTED_USER. | Gdy baza danych jest ustawiona na stan RESTRICTED_USER, tylko członkowie db_owner stałej roli bazy danych i dbcreator oraz stałe role serwera sysadmin mogą łączyć się z bazą danych. Jeśli nie musisz już ograniczać dostępu do odpowiedniej bazy danych, ustaw dla bazy danych tryb wielu użytkowników przy użyciu następującego zapytania: ALTER DATABASE <dbname> SET MULTI_USER;.Uwaga: Aby sprawdzić, czy baza danych jest w stanie użytkownika z ograniczeniami, możesz użyć tego zapytania: SELECT name, user_access_desc FROM sys.databases WHERE name = '<dbname>';.Jeśli nadal musisz ograniczyć dostęp do bazy danych, ale chcesz włączyć łączność dla danych logowania, których dotyczy problem, zmień domyślną bazę danych na inną bazę danych na serwerze. |
| Domyślna baza danych jest w trybie offline. | Nie można zmodyfikować bazy danych, która znajduje się w stanie offline. Bazę danych możesz przenieść do trybu online przy użyciu następującego zapytania: ALTER database <dnname> SET ONLINE;.Możesz sprawdzić, czy baza danych jest w trybie OFFLINE przy użyciu programu SSMS, lub za pomocą tego zapytania: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.Aby uzyskać więcej informacji, zobacz Opcje stanów bazy danych i ALTER DATABASE SET (Transact-SQL) — SQL Server. Jeśli nadal musisz zachować bazę danych w stanie offline, ale chcesz włączyć łączność dla danych logowania, których dotyczy problem, zmień domyślną bazę danych na inną bazę danych na serwerze. |
| Domyślna baza danych jest ustawiona na stan AWARYJNY. | Baza danych mogła zostać umieszczona w stanie AWARYJNYm na potrzeby rozwiązywania problemów przez administratora systemu. Tylko użytkownicy roli administratora systemu mogą uzyskiwać dostęp do baz danych ustawionych na stan awaryjny. Bazę danych możesz przenieść do trybu online przy użyciu następującego zapytania: ALTER database <dnname> SET ONLINE;.Możesz sprawdzić, czy baza danych jest w stanie awaryjnym przy użyciu programu SSMS lub tego zapytania: SELECT DATABASEPROPERTYEX (N'<dbname>', N'STATUS') AS N'Database Status';.Aby uzyskać więcej informacji, zobacz Opcje stanów bazy danych i ALTER DATABASE SET (Transact-SQL). Jeśli nadal musisz zachować bazę danych w stanie awaryjnym, ale chcesz włączyć łączność dla dotkniętych logowań, zmień domyślną bazę danych na inną bazę danych na serwerze. |
| Domyślna baza danych jest częścią dublowania bazy danych. | Nie można nawiązać połączenia z dublowaniem bazy danych na serwerze dublowania i takie zachowanie jest zgodnie z projektem. Aby sprawdzić, czy baza danych jest obecnie w roli dublowania, użyj tego zapytania SELECT DB_NAME(database_id) as database_name, mirroring_role_desc FROM sys.database_mirroring WHERE DB_NAME(database_id) = '<dbname>';. Aby uzyskać więcej informacji na temat dublowania baz danych, zobacz Database Mirroring (SQL Server). |
| Konto logowania może być członkiem wielu grup, a domyślna baza danych dla jednej z grup jest niedostępna w momencie połączenia. | Aby wyliczyć grupy, które mają określonego użytkownika przy użyciu programu PowerShell, zobacz Get-ADPrincipalGroupMembership (ActiveDirectory). |
Zmienianie domyślnej bazy danych dla danego użytkownika
Aby wprowadzić zmiany w domyślnej bazie danych użytkownika, musisz mieć uprawnienie ALTER ANY LOGIN. Jeśli zmieniany identyfikator logowania jest członkiem stałej roli serwera sysadmin lub grantee uprawnienia SERWERA KONTROLI, wymaga również uprawnienia CONTROL SERVER podczas wprowadzania następujących zmian. Członkowie roli administratora systemu mają te uprawnienia domyślnie włączone. Aby uzyskać więcej informacji, zobacz ALTER LOGIN (Transact-SQL).
Zmienianie domyślnej bazy danych przy użyciu programu SSMS
Połącz się z wystąpieniem programu SQL Server przy użyciu programu SQL Server Management Studio (SSMS).
Wybierz pozycjęIdentyfikatory logowaniazabezpieczeń>, aby zlokalizować użytkownika i zmienić domyślną bazę danych użytkownika na inną, która jest obecnie dostępna na stronie Ogólne właściwości logowania w programie SSMS. Więcej informacji można znaleźć w artykule Utworzenie logowania.
Po nawiązaniu połączenia z wystąpieniem programu SQL Server można wykonać instrukcję
ALTER LOGIN, podobnie jak w następujących przykładach:ALTER LOGIN <LoginName> WITH DEFAULT_DATABASE = <AvailableDatabaseName>;<AvailableDatabaseName>jest symbolem zastępczym nazwy istniejącej bazy danych, do których można uzyskać dostęp za pomocą identyfikatora logowania programu SQL Server w wystąpieniu.<LoginName>jest symbolem zastępczym logowania programu SQL Server z niezbędnymiALTER LOGINuprawnieniami.Przykład:
ALTER LOGIN [SQLLogin] WITH DEFAULT_DATABASE = master; ALTER LOGIN [Constoso\Windowslogin] WITH DEFAULT_DATABASE = [AdventureWorks];
Błąd 18456 jest wyświetlany wraz z błędem 4064
W przypadku korzystania z aplikacji, takich jak program SSMS, który otrzymuje błąd 4064 wyświetlany użytkownikowi, w dzienniku błędów programu SQL Server jest rejestrowany następujący komunikat. Jest to zamierzone działanie. Naprawianie domyślnej bazy danych dla nieudanego logowania przy użyciu procedur opisanych w tym artykule powoduje automatyczne usunięcie błędu 18456.
2023-02-06 18:17:02.56 Logon Error: 18456, Severity: 14, State: 40.
2023-02-06 18:17:02.56 Logon Login failed for user '<user name>. Reason: Failed to open the database '<db_name>' specified in the login properties. [CLIENT: <hostname >]