SQL Server Error 18456: State Kodlarına Göre Gerçek Neden
SQL Server Error 18456: "Login failed" — State Numarası Neyi Anlatıyor?
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
Login failed for user 'uygulama'. Reason: Password did not match that for the login provided.
[CLIENT: 10.0.4.22]Bu hata mesajının en değerli kısmı, istemciye gösterilmeyen State numarasıdır ve yalnızca sunucudaki ERRORLOG'da görünür. State, "kimlik doğrulama mı, yetkilendirme mi, veritabanı mı" sorusunu tek başına yanıtlar.
▸State kodları: teşhis tablosu
| State | Anlamı | İlk bakılacak yer |
|---|---|---|
| 2, 5 | Kullanıcı/oturum açma adı bulunamadı | Login gerçekten var mı, adı doğru mu |
| 7, 8 | Şifre uyuşmuyor | Şifre; Windows-only modda mı çalışıyor (karma mod kapalı) |
| 11, 12 | Login geçerli ama sunucu erişimi reddedildi | Hesap devre dışı, kilitli, ya da kimlik doğrulama türü uyuşmuyor |
| 18 | Şifre değiştirilmeli | MUST_CHANGE işaretli hesap |
| 38, 40 | Login'in varsayılan veritabanı açılamadı | Varsayılan DB silinmiş, offline veya erişilemez |
▸Adım adım çözüm
1. State numarasını ERRORLOG'dan okuyun.
EXEC xp_readerrorlog 0, 1, N'18456';Bu, en hızlı ve en güvenilir başlangıçtır. Mesajın tamamında State: N ifadesini arayın.
2. Kimlik doğrulama modunu doğrulayın.
SELECT SERVERPROPERTY('IsIntegratedSecurityOnly') AS sadece_windows;1 dönerse sunucu yalnızca Windows kimlik doğrulaması kabul ediyor; SQL login ile bağlanmaya çalışmak State 8 üretir. Karma moda geçiş, SSMS'te sunucu özelliklerinden yapılır ve servis yeniden başlatılmasını gerektirir.
3. Login'in durumunu ve varsayılan veritabanını kontrol edin.
SELECT name, type_desc, is_disabled, default_database_name,
create_date, modify_date
FROM sys.server_principals
WHERE type IN ('S', 'U', 'G')
ORDER BY name;is_disabled = 1 ise:
ALTER LOGIN [uygulama] ENABLE;Varsayılan veritabanı silinmişse State 40 alırsınız. Çözüm:
ALTER LOGIN [uygulama] WITH DEFAULT_DATABASE = [master];Ardından hedef veritabanında kullanıcı eşleşmesini onarın:
USE [uygulama_db];
SELECT dp.name, dp.type_desc, sp.name AS server_login
FROM sys.database_principals dp
LEFT JOIN sys.server_principals sp ON dp.sid = sp.sid
WHERE dp.type IN ('S', 'U') AND sp.name IS NULL; -- yetim kullanıcılar4. `NT AUTHORITY\ANONYMOUS LOGON` görüyorsanız sorun şifre değil. Bu, Kerberos'un iki atlamayı geçemediği (double-hop) klasik durumdur: istemci → uygulama sunucusu → SQL Server. Çözüm, SQL Server için SPN kaydı ve temsil (delegation) yapılandırmasıdır.
▸Bunu bir daha yaşamamak için
Login envanterini (sys.server_principals) ve veritabanı kullanıcı eşleşmelerini düzenli kontrol edin. Yetim kullanıcılar, veritabanı geri yüklemesinden sonra sessizce oluşur ve ilk kesintide patlar.
▸İlgili Mühendislik Rehberleri ve İç Linkler
- •SQL Server Deadlock (Error 1205) Analizi
- •SQL Server Pool Timeout Kılavuzu
- •Test edilen sürümler: SQL Server 2019 / 2022
SQL Server Diğer Üretim Rehberleri
Aynı veritabanı motoruna ait doğrulanmış diğer içerikler.
SQL Server Error 1205 Deadlock: Grafiği Bulma ve Önleme
SQL Server 1205 hatasında deadlock grafiğini system_health oturumundan çıkarma, kurban seçimini anlama ve kalıcı önleme yöntemleri.
SQL Server Pool Timeout: Bağlantı Havuzu Tükenmesi Çözümü
"Timeout expired prior to obtaining a connection from the pool" hatasının komut zaman aşımından farkı, sızıntı tespiti ve .NET tarafında kalıcı düzeltme.
SQL Server Msg 9002: Transaction Log Full Hatası Çözümü
9002 hatasında log_reuse_wait_desc çıktısını okumak, LOG_BACKUP / ACTIVE_TRANSACTION / AVAILABILITY_REPLICA nedenlerine göre ayrı çözümler ve VLF yönetimi.