Press ESC to close

Oracle Database Constraint Management (Enable & Disable)

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

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir