Veritabanı hatalarını işleme

Adobe AIR 1.0 ve üstü

Veritabanı hatalarının işlenmesi genellikle diğer çalışma zamanı hatalarının işlenmesine benzer. Oluşabilecek hatalar için hazırlanmış bir kod yazmalı ve bunu yapmayı çalışma zamanına bırakmak yerine hatalara yanıt vermelisiniz. Olası veritabanı hataları genel anlamda üç kategoriye ayrılabilir: bağlantı hataları, SQL sözdizim hataları ve sınırlama hataları.

Bağlantı hataları

Veritabanı hatalarının çoğu bağlantı hatalarıdır ve bunlar herhangi bir işlem sırasında oluşabilir. Bunlar bağlantı hatalarını engellemeye yönelik stratejiler olsa da, veritabanı uygulamanızın çok önemli bir parçasıysa, bazen bir bağlantı hatasını düzgün biçimde gidemenin kolay bir yolu vardır.

Çoğu bağlantı hatası, çalışma zamanının işletim sistemiyle, dosya sistemiyle ve veritabanı dosyasıyla iletişim kurma biçimiyle ilgilidir. Örneğin, kullanıcının dosya sistemindeki belirli bir konumda veritabanı dosyası oluşturmak için izni yoksa, bir bağlantı hatası oluşur. Aşağıdaki stratejiler, bağlantı hatalarını engellemeye yardımcı olur:

Kullanıcıya özgü veritabanı dosyaları kullanın
Tek bir bilgisayardaki uygulamayı kullanan tüm kullanıcılar için tek bir veritabanı dosyası kullanmak yerine, her kullanıcıya kendi veritabanı dosyasını verin. Dosya, kullanıcının hesabıyla ilişkilendirilmiş bir dizinde konumlandırılmalıdır. Bu örneğin, uygulama depo dizini, kullanıcının belgeler klasörü, kullanıcının masaüstü, vb. olabilir.

Farklı kullanıcı türlerini dikkate alın
Uyulamanızı farklı işletim sistemlerinde farklı kullanıcı hesabı türleriyle test edin. Kullanıcının bilgisayarda yönetici iznine sahip olduğunu varsaymayın. Ayrıca, uygulamayı yükleyen kişinin, uygulamayı çalıştıran kullanıcı olduğunu varsaymayın.

Farklı dosya konumlarını dikkate alın
Kullanıcının bir veritabanı dosyasını nereye kaydedeceğini veya açacağı dosyanın yerini belirlemesine izin verirseniz, kullanıcının kullanabileceği olası farklı dosya konumlarını dikkate alın. Ayrıca, kullanıcının veritabanı dosyalarını saklayacağı (veya açacağı) konumlara ilişkin sınırlar tanımlamayı düşünün. Örneğin, kullanıcıların yalnızca kullanıcı hesabının depo konumunda yer alan dosyaları açmasına izin verebilirsiniz.

Bağlantı hatası oluşursa, büyük olasılıkla ilk veritabanı oluşturma veya açma girişimi sırasında gerçekleşir. Bu, kullanıcının uygulamadaki herhangi bir veritabanı ilişkili işlemi yapamadığı anlamına gelir. Salt okunur veya izin hataları gibi belirli hata türleri için, olası kurtarma tekniklerinden biri veritabanı dosyasını farklı bir konuma kopyalamaktır. Uygulama veritabanı dosyasını kullanıcının dosya oluşturma ve yazma izninin olmadığı farklı bir konuma kopyalayabilir ve bu konumu kullanabilir.

Sözdizim hataları

Bir SQL ifadesi yanlış biçimde oluşturulduğunda ve uygulama ifadeyi yürütmeye çalıştığında bir sözdizim hatası oluşur. Yerel veritabanı SQL ifadeleri dizeler halinde oluşturulduğundan, derleme zamanı SQL sözdiziminin kontrol edilmesi mümkün değildir. Sözdizimlerini kontrol etmek için, tüm SQL ifadeleri yürütülmelidir. SQL sözdizim hatalarını önlemek için aşağıdaki stratejileri kullanın:

Tüm SQL ifadelerini test edin
Uygulamanızı geliştirirken mümkünse SQL ifadelerinizi uygulama kodunda ifade metni olarak kodlamadan önce ayrıca test edin. Ayrıca, tüm olası seçenekleri ve koddaki değişimi deneyen bir dizi test oluşturmak için birim testi gibi bir kod testi yaklaşımını kullanın.

İfade parametrelerini kullanın ve SQL'i bitiştirmekten (dinamik olarak oluşturmaktan) kaçının
Parametre kullanmak ve dinamik olarak oluşturulan SQL ifadelerinden kaçınmak, bir ifade her yürütüldüğünde aynı SQL ifade metninin kullanılması anlamına gelir. Sonuç olarak, ifadelerinizi test etmeniz ve olası değişimleri sınırlamanız çok daha kolaydır. Bir SQL ifadesini dinamik olarak oluşturmanız gerekiyorsa, ifadenin dinamik bölümlerini minimum düzeyde tutun. Ayrıca, sözdizim hatalarına neden olmayacağından emin olmak için, her kullanıcı girdisini dikkatlice doğrulayın.

Uygulamanın, bir sözdizim hatasını kurtarmak için bir SQL ifadesini incelemek ve sözdizimini düzeltmek üzere karmaşık mantığa ihtiyacı olacaktır. Kodunuz, sözdizim hatalarını önlemek için yukarıda belirtilen yönergeleri takip ederek herhangi bir olası SQL sözdizim hatası çalışma zamanı kaynağını tanımlayabilir (bir ifadede kullanılan kullanıcı girişi gibi). Sözdizim hatalarının kurtarılması için kullanıcıya yol gösterin. İfadenin düzgün biçimde yürütülmesi için neyin düzeltilmesi gerektiğini gösterin.

Sınırlama hataları

Bir INSERT veya UPDATE ifadesi bir sütuna veri eklemeye çalıştığında sınırlama hataları oluşur. Yeni veriler tablo veya sütun için tanımlanan sınırlamalardan birini ihlal ediyorsa hata oluşur. Olası sınırlamalar kümesi şunları içerir:

Benzersiz sınırlama
Bir tablodaki satırlar arasında, bir sütunda çift değer olamayacağını gösterir. Alternatif olarak, birden çok sütun benzersiz bir sınırlamada birleştirildiğinde, bu sütunlardaki değerlerin bileşimi çift olamaz. Diğer bir deyişle, belirtilen benzersiz sütun veya sütunlar bakımından, her satır farklı olmalıdır.

Ana anahtar sınırlaması
Bir sınırlamanın izin verdiği ve vermediği veriler bakımından, ana anahtar sınırlaması benzersiz sınırlamayla aynıdır.

Null sınırlaması
Tek bir sütunun NULL değerini saklayamayacağını ve sonuç olarak her satırda bu sütunun bir değere sahip olması gerektiğini belirtir.

Denetim sınırlaması
Bir veya birden çok tablo için rasgele bir sınırlama belirtmenize olanak verir. Yaygın bir denetim sınırlaması, bir sütunun değerinin belirli sınırlar içinde olması gerektiğini tanımlayan bir kuraldır. (Örneğin, sayısal bir sütunun değeri 0'dan büyük olmalıdır.) Diğer bir yaygın denetim sınırlaması türü, sütun değerleri arasındaki ilişkileri belirtir. (Örneğin, bir sütunun değeri aynı satırdaki diğer sütunların değerinden farklı olmalıdır.)

Veri türü (sütun yakınlığı) sınırlaması
Çalışma zamanı, sütun değerleri için bir veri türü belirler ve bir sütunda yanlış türde bir değeri saklama girişiminde bulunulduğunda hata oluşur. Ancak, çoğu durumda değerler sütunun belirtilen veri türüyle eşleşecek biçimde dönüştürülür. Daha fazla bilgi için bkz. Veritabanı veri türleriyle çalışma .

Çalışma zamanı, yabancı anahtar değerleri üzerinde sınırlama uygulamaz. Başka bir deyişle, yabancı anahtar değerlerinin var olan bir ana anahtar değeriyle eşleşmesi gerekmez.

Önceden tanımlı sınırlama türlerinin yanı sıra, çalışma zamanı SQL motoru, tetikleyicilerin kullanımını destekler. Tetikletici, olay işleyiciye benzer. Belirli bir eylem gerçekleştiğinde yürütülen, önceden tanımlı bir talimatlar kümesidir. Örneğin, bir tetikleyici belirli bir tabloya veri eklendiğinde veya bu tablodan veri silindiğinde çalışacak biçimde tanımlanabilir. Olası bir tetikleyici kullanımı, tetikleyicinin veri değişikliklerini incelemesi ve belirlenen koşullar karşılanmıyorsa bir hataya neden olmasıdır. Sonuç olarak tetikleyici, sınırlamayla aynı amaca hizmet edebilir ve sınırlama hatalarının önlenmesi ve kurtarılmasına ilişkin stratejiler tetikletici tarafından oluşturulan hatalar için de geçerlidir. Ancak, tetikleyici tarafından oluşturulan hatalara ilişkin hata kimliği, sınırlama hatalarına ilişkin hata kimliğinden farklıdır.

Belirli bir tabloya uygulanan sınırlama kimesi, uygulamanızı tasarladığınız sırada belirlenir. Sınırlamaların bilinçli şekilde tasarlanması, uygulamanızı sınırlama hatalarının önlenmesi ve kurtarılmasına yönelik tasarlamanızı kolaylaştırır. Ancak, sınırlama hatalarının sistematik olarak tahmin edilmesi ve önlenmesi zordur. Sınırlama hataları uygulama verileri eklenene kadar görünmediğinden, tahmin etmek zordur. Sınırlama hataları, oluşturulduktan sonra veritabanına eklenen verilerle oluşur. Bu hatalar genellikle yeni veriler ve veritabanında önceden bulunan veriler arasındaki ilişkinin bir sonucudur. Aşağıdaki stratejiler, birçok sınırlama hatasının önlenmesine yardımcı olur:

Veritabanı yapısını ve sınırlamaları dikkatlice planlayın
Sınırlamaların amacı uygulama kuralları koymak ve veritabanı verilerinin bütünlüğünü korumaya yardımcı olmaktır. Uygulamanızı planlarken, veritabanınızı uygulamanızı desteklemesi açısından nasıl yapılandırmanız gerektiğini düşünün. Bu işlemin bir parçası olarak, verilerinize ilişkin belirli değerlerin gerekli olup olmadığı, bir değerin varsayılanı olup olmadığı, çift değerlerin izinli olup olmadığı, vb. kuralları tanımlayın. Bu kurallar, veritabanı sınırlamalarını tanımlamanızda size rehberlik eder.

Sütun adlarını açıkça belirtin
INSERT ifadesi, değerlerin ekleneceği sütunları açık biçimde belirtmeden yazılabilir, ancak böyle yapmak, gerekli olmayan bir risktir. Değerlerin ekleneceği sütunları açık biçimde adlandırarak otomatik olarak oluşturulan değerlere, varsayılan değerler içeren sütunlara ve NULL değerlerine izin veren sütunlara olanak tanıyabilirsiniz. Ayrıca, bunu yaparak tüm NOT NULL sütunlarına açık biçimde bir değerin eklenmesini garanti edebilirsiniz.

Varsayılan değerler kullanın
Bir sütun için NOT NULL sınırlamasını belirlediğinizde, mümkünse sütun tanımında varsayılan bir değer belirleyin. Uygulama kodu da varsayılan değerler sağlayabilir. Örneğin, kodunuz bir String değişkeninin null olup olmadığını kontrol edebilir ve bir ifade parametre değeri ayarlamak için kullanmadan önce bu değişkene bir değer atayabilir.

Kullanıcı tarafından girilen verileri doğrulayın
Özellikle NOT NULL ve CHECK sınırlamalarının olduğu durumlarda kullanıcı tarafından girilen verilerin sınırlamalar tarafından belirtilen sınırlara uyduğundan emin olmak için bu verileri önceden kontrol edin. Doğal olarak, bir UNIQUE sabitinin kontrol edilmesi daha zordur, çünkü bu kontrol verilerin benzersiz olup olmadığını belirlemek için bir SELECT sorgusunun yürütülmesini gerektirir.

Tetikleyiciler kullanın
Eklenen verileri doğrulayan (ve değiştirebilen) veya geçersiz verileri düzeltmek için diğer eylemleri gerçekleştiren bir tetikleyici yazabilirsiniz. Bu doğrulama ve düzeltme, bir sınırlama hatasının oluşmasını önleyebilir.

Sınırlama hatalarının engellenmesi, birçok bakımdan diğer türdeki hataların engellenmesinden daha zordur. Yine de, uygulamayı istikrarsız ve kullanılamaz bir duruma getirmeden bu hataları kurtarmaya yönelik birkaç strateji vardır:

Çakışma algoritmaları kullanın
Bir sütunda sınırlama tanımladığınızda ve bir INSERT veya UPDATE ifadesi oluşturduğunuzda, bir çakışma algoritması belirleme seçeneğine sahip olursunuz. Çakışma algoritması, bir sınırlama ihlali gerçekleştiğinde veritabanının yapacağı eylemi tanımlar. Veritabanı motorunun gerçekleştirebileceği birkaç olası eylem vardır. Veritabanı motoru tek bir ifadeyi veya tüm işlemi sonlandırabilir. Hatayı yoksayabilir. Eski verileri kaldırıp bunları kodun saklamaya çalıştığı verilerle değiştirebilir.

Daha fazla bilgi için, yerel veritabanlarında SQL desteği bölümünde bulunan “ON CONFLICT (çakışma algoritmaları)” bölümüne bakın.

Düzeltici geribildirim sağlayın
Belirli bir SQL komutunu etkileyebilecek sınırlamalar kümesi önceden tanımlanabilir. Sonuç olarak, bir ifadenin neden olabileceği sınırlama hatalarını tahmin edebilirsiniz. Bu bilgiyle, bir sınırlama hatasına yanıt vermek için uygulama mantığı oluşturabilirsiniz. Örneğin, bir uygulamanın yeni ürünlerin girişi için bir veri giriş formu içerdiğini varsayın. Veritabanındaki ürün adı sütunu UNIQUE sınırlamasıyla tanımlanıyorsa, veritabanına yeni bir ürün satırı ekleme eylemi bir sınırlama hatasına neden olabilir. Sonuç olarak, uygulama bir sınırlama hatasını tahmin edecek biçimde tasarlanmıştır. Hata gerçekleştiğinde, uygulama kullanıcıyı belirtilen ürün adının zaten kullanılmakta olduğunu göstererek ve farklı bir ürün adı seçmesini isteyerek kullanıcıyı uyarır. Olası başka bir yanıt, kullanıcının aynı ada sahip diğer ürün hakkındaki bilgileri görüntülemesine izin vermektir.