MySQL Error 1142 — Yetki Verdim ama Neden Hâlâ Reddediliyor?
1142 hatasında USER() ile CURRENT_USER() farkı, host bazlı hesap eşleşmesi, veritabanı/tablo/kolon yetkileri ve MySQL 8 rollerinin etkinleştirilmesi.
Operasyonel Doğrulama & Güvenilirlik Standardı
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
ERROR 1142 (42000): SELECT command denied to user 'app'@'10.0.2.15' for table 'siparis'
ERROR 1143 (42000): SELECT command denied to user 'app'@'10.0.2.15' for column 'tutar' in table 'siparis'SQLSTATE kodu: 42000.
Bu hata, PostgreSQL'deki H-34 (permission denied for table) ve SQL Server'daki H-39 (Msg 229: SELECT permission was denied) rehberlerinin MySQL karşılığıdır; böylece veritabanı yetki reddi üçlüsü tamamlanmış olur.
İki hata kodunu ayırın:
- •1142: Reddedilme tablo veya görünüm (view) düzeyindedir.
- •1143: Reddedilme kolon (column) düzeyindedir. Kısıtlı bir kolon (örneğin kredi kartı veya kimlik no) içeren bir sorgu çalıştırdıysanız 1143 alırsınız; tablo genelinde yetki aramak yanlış yönde zaman kaybettirir.
app değil, `'app'@'host'` çiftidir. 'app'@'localhost' ile 'app'@'10.0.2.%' tamamen iki ayrı hesaptır ve yetki tablolarında ayrı satırlarda yaşarlar. "Kullanıcıya yetki verdim ama hâlâ hata alıyor" şikâyetinin %90 nedeni, yetkinin istemcinin bağlandığı gerçek host tanımına verilmemiş olmasıdır.▸Nedenini Doğrulayan En Değerli İki Satır
SELECT USER() AS gonderilen_kimlik, CURRENT_USER() AS eslesen_hesap;- •`USER()`: İstemci uygulamasının MySQL'e bağlanırken talep ettiği kullanıcı ve geldiği kaynak IP adresidir.
- •`CURRENT_USER()`: MySQL yetki motorunun (ACL) kuralları tarayarak istemciyi fiilen eşleştirdiği hesaptır.
İkisi birbirinden farklıysa sorun yetki listesinde değil, hesap eşleşmesindedir! Örneğin USER() app@10.0.2.15 derken CURRENT_USER() app@% dönebilir. Siz gidip spesifik 'app'@'10.0.2.15' hesabına yetki verdiyseniz, MySQL daha genel olan 'app'@'%' hesabını eşleştirdiği için yetkiniz hiçbir şekilde devreye girmez!
Etkin Yetkileri Listeleme
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'app'@'10.0.2.%';▸Dört Yetki Katmanı ve MySQL 8 Rol Tuzağı
1. Host Bazlı Hesap Önceliği
MySQL bağlantı anında en dar host maskesinden en geniş maskeye doğru (localhost → IP → CIDR → %) sıralama yapar. Geniş bir % tanımı daha özel bir tanımı gölgeleyebilir.
2. Kolon Düzeyi Yetki Tuzağı
Bir kullanıcıya sadece UPDATE yetkisi verip SELECT vermezseniz, şu sorgu anında patlar:
UPDATE siparis SET durum = 'iptal' WHERE tutar = 0;Sorgunun WHERE tutar = 0 filtresini değerlendirebilmesi için tutar kolonu üzerinde SELECT yetkisi zorunludur.
3. MySQL 8 Rol Tuzağı: Yetki Var Ama Etkin Değil!
MySQL 8.0 ile roller geldi:
GRANT r_okuyucu TO 'app'@'10.0.2.%';Bu komut yetkiyi verir, ancak rolü etkinleştirmez! Oturum açıldığında rol etkin değilse:
SELECT CURRENT_ROLE();
-- Boş döner (NONE)!SHOW GRANTS çıktısında rol görünmesine rağmen kullanıcı SELECT yapamaz ve 1142 alır.
▸Adım Adım Kalıcı Çözüm
1. Doğru Hesaba Doğru Kapsamda Yetki Verin
GRANT SELECT ON app.siparis TO 'app'@'10.0.2.%';2. FLUSH PRIVILEGES Şehir Efsanesini Bırakın
GRANT ve REVOKE komutları MySQL bellek içi yetki önbelleğini anında günceller; ardından FLUSH PRIVILEGES çalıştırmak tamamen gereksizdir. Bu komut yalnızca mysql.user tablosunu doğrudan INSERT/UPDATE ile değiştirdiğinizde gereklidir.
3. Rolleri Otomatik Olarak Etkinleştirin (SET DEFAULT ROLE)
MySQL 8 kullanıyorsanız verilen rolleri varsayılan yapın:
CREATE ROLE r_okuyucu;
GRANT SELECT ON app.* TO r_okuyucu;
GRANT r_okuyucu TO 'app'@'10.0.2.%';
-- Kritik Adım:
SET DEFAULT ROLE ALL TO 'app'@'10.0.2.%';Artık kullanıcı bağlandığı anda rolü otomatik olarak devralır ve 1142 almaz.
▸İlgili Hata Rehberleri & Hub Bağlantıları
- •PostgreSQL Permission Denied for Table (H-34) — PostgreSQL tarafındaki yetki karşılığı
- •SQL Server Msg 229 Permission Denied (H-39) — SQL Server tarafındaki yetki karşılığı
- •MySQL Access Denied 1045 (H-03) — Oturum açma ve parola hataları
- •MySQL Hub — Güvenlik standartları ve yetki yönetimi
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.
MySQL Deadlock ERROR 1213: Grafiği Okuma ve Kalıcı Önleme
MySQL 1213 deadlock hatasının nedeni, LATEST DETECTED DEADLOCK çıktısını okuma, gap lock kaynaklı kilitlenmeler ve uygulama tarafında retry tasarımı.
MySQL Lock wait timeout exceeded: Bloklayan İşlemi Bulma
1205 lock wait timeout hatasında bloklayan işlemi performance_schema ile bulma, KILL kararını verme ve kilidi kalıcı olarak azaltma yöntemleri.