
Veritabanı sistemlerinde veri tutarlılığını, doğruluğunu ve bütünlüğünü sağlamak kritik öneme sahiptir. Oracle Database gibi gelişmiş veritabanı sistemleri, bu amaçla “constraint” yani kısıtlamaları kullanır. Constraint’ler, bir tabloya veri eklerken veya değiştirirken belirli kuralların ihlal edilmemesini sağlar.
Bu yazıda Oracle veritabanında kullanılan temel constraint türlerini, ne işe yaradıklarını ve gerektiğinde bu constraint leri nasıl devre dışı bırakıp tekrar etkinleştirebileceğinizi örneklerle açıklayacağız. Ayrıca, yaygın kullanım senaryoları ve PL/SQL script’lerini de paylaşacağız.
Oracle’da Constraint Nedir?
Constraint ler, bir tabloya girilen verilerin belirli kurallar çerçevesinde geçerliliğini kontrol eder. Temel constraint türleri şunlardır:
•Primary Key Her satır için benzersiz ve boş olamayan bir değer sağlar.
•Foreign Key : Bir sütundaki değerin başka bir tablodaki sütunla eşleşmesini zorunlu kılar.
•Check: Belirli bir sütundaki verilerin tanımlanan kurallara uygun olup olmadığını denetler. Örneğin, değer 1 ile 100 arasında olmalı gibi.
•Unique : Sütundaki değerlerin tekrar etmemesini sağlar, ama null olabilirler.
Bu kısıtlamalar, veritabanı yapınızın tutarlı kalmasına yardımcı olur ve olası veri tutarsızlıklarının önüne geçer. İyi hoş güzelde o zaman neden bu constraintleri devre dışı bırakma enable disable işleri ile uğraşıyoruz.
Neden Constraint’leri Devre Dışı Bırakmak Gerekebilir?
Zaman zaman bazı geçici işlemler için constraint leri devre dışı bırakmak gerekebilir. İşte bazı yaygın senaryolar:
•Bulk İşlemlerinde (Insert, Delete veya Update) Büyük miktarda veriyi yüklerken constraint kontrolleri performansı düşürebilir, veya bu işlemi yapmayı engelleyebilir.
•Alter İşlemleri: Tablo yapısında yapılan değişikliklerde, geçici olarak bazı constraint’leri kapatmak gerekebilir.
•Debugging: Belirli bir hatanın constraint kaynaklı olup olmadığını test etmek için geçici olarak devre dışı bırakılabilir.
Not: Constraint leri devre dışı bırakmak veri bütünlüğünü geçici olarak bozabileceğinden, bu işlemleri dikkatli yapmak ve işlem sonunda constraint’leri yeniden etkinleştirmek çok önemlidir.
Check Constraint Enable
col sid format 999999
col username format a20
col osuser format a15
select b.spid,a.sid, a.serial#,a.username, a.osuser
from v$session a, v$process b
where a.paddr= b.addr
and b.spid='&spid'
order by b.spid;
Check Constraint Disable
SET SERVEROUTPUT ON
DECLARE
v_table_name VARCHAR2(30) := UPPER('&1');
v_owner VARCHAR2(30) := UPPER('&2');
BEGIN
FOR c IN (SELECT constraint_name FROM all_constraints
WHERE constraint_type = 'C'
AND owner = v_owner
AND table_name = DECODE(v_table_name, 'ALL', table_name, v_table_name)) LOOP
DBMS_OUTPUT.PUT_LINE('Devre dışı bırakılıyor: ' || c.constraint_name);
EXECUTE IMMEDIATE 'ALTER TABLE "' || v_owner || '"."' || v_table_name || '" DISABLE CONSTRAINT "' || c.constraint_name || '"';
END LOOP;
END;
/
Primary Key Enable
DECLARE
schema_name VARCHAR2(30) := UPPER('&1');
table_name VARCHAR2(30) := UPPER('&2');
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE "' || schema_name || '"."' || table_name || '" ENABLE PRIMARY KEY';
END;
/
Primary KEY DISABLE
DECLARE
schema_name VARCHAR2(30) := UPPER('&1');
table_name VARCHAR2(30) := UPPER('&2');
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE "' || schema_name || '"."' || table_name || '" DISABLE PRIMARY KEY';
END;
/
Foreign Key Constraint ENABLE
DECLARE
v_table_name VARCHAR2(30) := UPPER('&1');
v_owner VARCHAR2(30) := UPPER('&2');
BEGIN
FOR c IN (SELECT constraint_name, table_name, owner
FROM all_constraints
WHERE constraint_type = 'R'
AND table_name = DECODE(v_table_name, 'ALL', table_name, v_table_name)
AND owner = v_owner) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE "' || c.owner || '"."' || c.table_name || '" ENABLE CONSTRAINT "' || c.constraint_name || '"';
END LOOP;
END;
/
Foreign Key Constraint DISABLE
DECLARE
v_table_name VARCHAR2(30) := UPPER('&1');
v_owner VARCHAR2(30) := UPPER('&2');
BEGIN
FOR c IN (SELECT constraint_name, table_name, owner
FROM all_constraints
WHERE constraint_type = 'R'
AND table_name = DECODE(v_table_name, 'ALL', table_name, v_table_name)
AND owner = v_owner) LOOP
EXECUTE IMMEDIATE 'ALTER TABLE "' || c.owner || '"."' || c.table_name || '" DISABLE CONSTRAINT "' || c.constraint_name || '"';
END LOOP;
END;
/
Bir yanıt yazın