Yabancıl Anahtar Kontrolleri
Yabancıl anahtar kontrolleri: Tanımlı ilişkilerin yabancıl anahtarlarla eşleştirilmesi ve kopyalanmamış verileri silebilecek yabancıl anahtarların reddedilmesi.
Veritabanında tanımlı yabancıl anahtarlar (foreign key) bir tavan (üst sınır) değil, tabandır (asgari gereksinimdir; yapılandırma en az bu ilişkileri kapsamalıdır, fazlasını da tanımlayabilir). Bir ilişki için veritabanında yabancıl anahtar tanımlı olması gerekmez: Uygulamanın kod içinde yönettiği ilişkiler yapılandırmada tanımlanır ve aynı şekilde arşivlenir. Bu kontroller, veritabanının gerçekten tanımladığı yabancıl anahtarlar için iki şeyi güvence altına alır: Görev dışındaki hiçbir tablo bir görev tablosuna başvurmaz. İki görev tablosu arasındaki her yabancıl anahtar da aynı şekilde eşleştirilmiş, yapılandırılmış bir ilişkiye karşılık gelir.
FK_INDEX_CHECK
Her ilişki, alt tabloda baştaki kolonları tam olarak foreign_key kolonlarından (sırası fark etmeksizin) oluşan bir indekse ihtiyaç duyar: Keşif aşaması alt tabloyu foreign_key üzerinden okur. Böyle bir indeks olmadan her yığın, tabloda tam tablo taraması (full table scan) yapar. Önek (prefix), fonksiyonel veya INVISIBLE indeksler sayılmaz. Bu kural, veritabanında yabancıl anahtarı tanımlı olmayan ilişkileri de kapsar.
Çözüm: CREATE INDEX idx_fk ON <table> (<foreign_key columns>).
FK_COVERAGE_CHECK
Görevin dışındaki bir tablo, bir görev tablosuna başvuran bir yabancıl anahtar tutuyor. Ebeveyn kaydın silinmesi ya başarısız olur (RESTRICT, NO ACTION) ya da GoArchive’ın hiç kopyalamadığı satırları değiştirir (CASCADE, SET NULL); bu nedenle her ON DELETE kuralı engelleyicidir. Gelen anahtarlar başvurulan şemaya göre bulunur; böylece başka bir şemada tanımlanmış bir kısıtlama da tespit edilir. Böyle bir tablo hiçbir zaman göreve katılamaz.
FK_COVERAGE_CHECK: Foreign key constraints not covered by relations
(fatal for any ON DELETE rule):
- orders is referenced by: [analytics.order_snapshots (ON DELETE CASCADE)]
Çözüm: Başvuran tablo aynı şemadaysa ve arşivlenmesi gerekiyorsa bu tabloyu göreve ekleyin. Aksi halde kısıtlamayı kaldırın veya başvurulan tabloyu görevin dışında bırakın.
INTERNAL_FK_COVERAGE
İki görev tablosu arasındaki bir yabancıl anahtar, aynı foreign_key kolonlarına sahip yapılandırılmış bir ilişkiye karşılık gelmiyor. Her satır kısıtlamayı ve nedenini belirtir:
[no relation: … is not configured under …]: Alt tablo, bu ebeveynin altında tanımlanmamış;[the relation's foreign_key is …]: İlişki başka kolonlar kullanıyor;[it references …, which is not the PRIMARY KEY of …]: Yabancıl anahtar ebeveyn tablonun benzersiz bir anahtarına (unique key) başvurmaktadır; ancakreferencesyalnızca birincil anahtarları desteklediğinden bu yapı reddedilir.
Bir tablo bir görevde yalnızca bir kez yer alabilir. Bu nedenle aynı alt tablodan aynı ebeveyne başka kolonlar üzerinden giden ikinci bir yabancıl anahtar yapılandırılamaz. Bu durum düzeltilmezse silme işlemi başarısız olur ya da bir ON DELETE CASCADE kuralı hiç kopyalanmamış alt kayıtları siler.
Çözüm: Her alt tabloyu, foreign_key ve references değerleri kısıtlamayla eşleşecek şekilde ebeveyninin altına yerleştirin veya iki tablodan birini görevin dışında bırakın.
FK_PAIRING_CHECK
İlişkinin foreign_key kolonları kısıtlamayla eşleşiyor; ancak references bu kolonları ebeveynin anahtar kolonlarıyla farklı biçimde eşleştiriyor. Yer değiştirmiş bir bileşik eşleştirme, başka bir ebeveynin alt kayıtlarını seçer.
Çözüm: references kolonlarını foreign_key ile eşleşen sırada listeleyin.
SELF_FK_DELETE_RULE_CHECK
Yalnızca arşivleme ve kalıcı silme görevlerinde çalışır. Kök veya alt tablo olan bir görev tablosunda, kendi tablosuna başvuran ve kuralı ON DELETE CASCADE veya SET NULL olan bir yabancıl anahtar var. Yığındaki bir satırın silinmesi, aynı tablonun yığın dışındaki ve hiç kopyalanmamış satırlarını siler ya da bu satırların ebeveyn bağlantısını temizler; çalıştırma ise başarılı olarak raporlanır. Her satır kısıtlamayı ve kuralını belirtir:
- comments(parent_id) -> comments(id) (constraint fk_comments_parent, ON DELETE CASCADE)
RESTRICT ve NO ACTION kontrolden geçer: Bu kuralların engellediği bir silme işlemi başarısız olur ve hiçbir veri kaybolmaz. Diğer tüm kurallar reddedilir.
Çözüm: Kısıtlamayı ON DELETE RESTRICT ile yeniden tanımlayın veya tablo için ayrı bir salt kopyalama (copy-only) görevi tanımlayın. Bir görevin türü, görev bir kez çalıştıktan sonra değiştirilemez.
FK_COVERAGE_VISIBILITY_CHECK
Yalnızca arşivleme ve kalıcı silme görevlerinde çalışır. GoArchive, hesabın okuyamadığı şemalardakiler dahil, göreve yönelen tüm yabancıl anahtarları gördüğünü kanıtlayamıyor. Bu kanıt olmadan, dışarıdaki bir ON DELETE CASCADE veya SET NULL kuralı hiç kopyalanmamış satırları değiştirebilir.
Kanıt, sunucunun yabancıl anahtar üst verisinin (metadata) tamamının başarıyla okunmasıdır ve bu okuma PROCESS yetkisi gerektirir. Okuma başarılı olduğunda durum complete olur; kontrolden geçen tek durum budur. Bu okuma başarısız olursa keşif, hesabın yetkilerine göre filtrelenmiş bir listeye geri döner ve durum unconfirmed olur. unknown ise hiçbir kanıtın oluşturulmadığı anlamına gelir. Mesaj hangi aşamanın başarısız olduğunu belirtir. Sorgu aşamasındaki bir hata yetkilerden, bağlantıdan veya sunucu durumundan kaynaklanabilir; bu nedenle önce günlüğe yazılan nedeni inceleyin.
Çözüm (günlüğe yazılan neden bir yetki reddiyse): GRANT PROCESS ON *.* TO <user>. Bir rol üzerinden sahip olunan PROCESS yetkisi kabul edilir.
