Yazılım Notları
Bilgi Paylaştıkça Çoğalır...

Foreign Key Constraint'leri Geçici Olarak Disable / Enable Yapmak

Veritabanı tasarımının ilişkisel (Relational) yapılması, veri bütünlüğü açısından son derece önemlidir. Ancak, bazı durumlarda, ilişkisel veritabanındaki tablolardan bazılarında belirli kayıtların silinmesi ya da, o tablodaki verilerin truncate edilmesi gerekebilmektedir. Bu noktada, Foreign Key Constraint'ler engel teşkil etmektedir. Bu makalede, bu sorunun nasıl çözülebileceğini ele alacağız.

İlişkisel olarak tasarlanmış bir veritabanındaki tablolarda TRUNCATE ya da DELETE işlemlerini yapabilmek için alternatif çözüm yolları bulunmaktadır. Bunlar:

  1. Birinci yol, veritabanındaki tüm Foreign Key Constraint'ler ya da sadece o tablo ile ilgili constraintler düşürülür(DROP), hangi işlemler yapılmak isteniyorsa (DROP, TRUNCATE, DELETE, vs.) yapılır. Sonra da, yeni Foreign Key Constraint'ler tekrar oluşturulur(CREATE). Ancak, bu yol hem riskli hem zaman alıcıdır.
  2. En iyi yol, veritabanındaki tüm Foreign Key Constraint'lerin ya da söz konusu tablo(lar) ile ilgili constraintlerin geçici olarak DISABLE edilmesi, operasyonların yapılması ve bu indexlerin tekrar ENABLE edilmesidir. Peki SQL Server'da nasıl yapabilirsiniz? İşte size, işinizi çok kolaylaştıracak scriptler:

SELECT 'ALTER TABLE ' +OBJECT_NAME(a.parent_object_id)+' NOCHECK CONSTRAINT '+a.name+';' from sys.foreign_keys a

UNION ALL

SELECT 'DELETE FROM tablo1 WHEREid=1;'

UNION ALL

SELECT 'Delete from tablo2 whereid=1;'

UNION ALL

SELECT 'Delete from tablo3 whereid=1;'

UNION all

SELECT 'ALTER TABLE ' +OBJECT_NAME(a.parent_object_id)+' CHECK CONSTRAINT '+a.name+';' from sys.foreign_keys a;

Bu script çalıştırıldığında elde edeceğimiz çıktı aşağıdaki gibi birşey olacaktır:

ALTER TABLE tablo1 NOCHECK CONSTRAINT FK_tbl1_tablo2;

ALTER TABLE tablo1 NOCHECK CONSTRAINT FK_tbl1_tablo3;

ALTER TABLE tablo2 NOCHECK CONSTRAINT FK_tbl2_tablo4;

DELETE FROM tablo1 WHERE ID=1;

DELETE FROM tablo2 WHERE ID=1;

DELETE FROM tablo3 WHERE ID=1;

ALTER TABLE tablo1 CHECK CONSTRAINT FK_tbl1_tablo2;

ALTER TABLE tablo1 CHECK CONSTRAINT FK_tbl1_tablo3;

ALTER TABLE tablo2 CHECK CONSTRAINT FK_tbl2_tablo4;

(25 row(s) affected)


Bu çıktıyı kopyalayıp, SQL Server Query penceresinde çalıştırdığımız zaman, Foreign Key Constraint'ler düşürülmeden(DROP edilmeden) geçici bir süre için DISABLE edilmiş, operasyonlar yapılmış ve bu indexler yeniden ENABLE edilmiş olur. Hiç bir riske de girmemiş olunur.

Mehmet
 

Banka Hesap Numaralarınızı, IBAN Numaralarınızı bir kere telefonunuza kaydedin. İhtiyaç duyduğunuzda elinizin altında olsun.

Banka Hesaplarım

En Güzel Sözler Uygulaması İçin


En Çok Rating Alanlar
Ana Sayfa       Arama       Valid CSS!