BASAMAKLA ve yabancı anahtar gereksinimlerini SINIRLAMADIĞI çatışan?

oy
2

Ben projelerde dosya ve bağımlılıkları izleyen bir veritabanı üzerinde çalışıyorum. Kısaca, iki ana tablolar; PROJELER tabloda isimleri ve diğer özellikleri proje, DOSYALARI tablo dosyaları listeler. Ben veritabanından bir proje kaydı silmek eğer öyleyse, ÇORUH ayarlanmış bir yabancı anahtar olarak bir projeye her dosya giriş noktaları, tüm dosya kayıtları yanı kaybolur. Çok uzak çok iyi.

Şimdi ek DEPENDENCIES tablo var. Bağımlılık tablosundaki her kayıt ilk dosya saniyede bağlı olduğunu belirterek, iki dosya olduğunu. Yine bu yabancı anahtarlar ilk ÇORUH (Bir dosya girişini silmek eğer öyleyse, bu kayıt silinir) olarak ayarlandığında, fakat ikinci (SINIRLAMADIĞI ayarlandığında bu yüzden diğer dosyaları bağlıysa bir dosya girişini silmek için izin değilim üstünde). Yine, her şey iyi görünüyor.

Ne yazık ki artık deyimi silmek tek SQL ile bir proje silebilirsiniz görünüyor! Silme çalışır-kaskad silme dosyaları, ancak bunlardan herhangi DEPENDENCIES tabloda görünen durumunda, yabancı anahtar silme (diğer sütun BASAMAKLA çünkü bağımlılıkları tabloda bu kayıt silinecektir olsa bile) engeller kısıtlamak. Sahip olduğum tek geçici çözüm bağımlılık rekor hiçbiri ihlal böylece dosyaları silmek ve projeyi çıkarmaya çalışmadan önce bir defada dosya kayıtları tek kaldırmak için tam bir düzen hesaplamaktır.

Tek bir SQL doğru diğer siler basamakla projeler tablodan silmek yani benim veritabanı şemasını kurmak için herhangi bir yolu var mı? Ben Firebird 2.1 kullanıyorum, ama bu herhangi bir fark yapar bilmiyorum - Orada bu işi yapmak için bir yol olması gerektiğini gibi görünüyor?

Oluştur 09/12/2008 saat 19:51
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
4

Bir basamaklı yabancı anahtarın içinden silinmesi sırasını kontrol edemez, ancak üzerinde bir tetikleyicisi tasarlamak mümkün olabilir PROJECTSsatırları silmek için FILESbu projeye ait olup aynı zamanda listelenen DEPENDENCIESdiğer bağımlı olarak FILES. Bir Make BEFORE DELETEtetik, bu nedenle basamaklı etkileri önce uygulamalıdır.

Böyle bir şey:

CREATE TRIGGER Del_Child_Files FOR PROJECTS
BEFORE INSERT IGNORE 
AS BEGIN
  FOR SELECT F.FILE_ID FROM FILES F JOIN DEPENDENCIES D 
      ON F.FILE_ID = D.CHILD_ID
    WHERE F.PROJECT_ID = OLD.PROJECT_ID
    INTO :file_id
  DO
    DELETE FROM FILES WHERE FILE_ID = :file_id;
  DONE
END

Bir proje silerken Yani, bu satırları silmek için tüm diğer dosyaları bağımlı olan bir projenin "çocuk" dosyalar ve bu şelaleler siler DEPENDENCIESböylece geri kalan bütün dosyalar bağımlılıkları ücretsizdir. Proje için silme artık bu dosyaları silmek için kaskad bağlayabilirsiniz.

Bunu test etmedim ve benim Firebird sözdizimi paslı olabilir, ama belki de başlamak gerekir.

Açıkçası, verilerinizin değil, canlı veri bir kopyasında Bunu test edin!

Cevap 09/12/2008 saat 20:24
kaynak kullanıcı

oy
0

Sistem destek kısıt çek bir taahhüt noktaya kadar ertelenebilir hangi kısıtlamaları, ertelenmiş mu?

Belki de bu olsa sadece Oracle şey.

Cevap 09/12/2008 saat 20:11
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more