← Database Management System Ana Sayfa
Bütünlük ve Güvenlik — CENG208
CENG208 · Veritabanı Yönetim Sistemleri

Bütünlük ve Güvenlik

Veritabanlarında veri bütünlüğünü koruma ve güvenliği sağlama yöntemleri — kısıtlamalar, onaylamalar, tetikleyiciler ve yetkilendirme.

Kısıtlamalar Assertions Triggers Authorization Oracle
1
Veri Bütünlüğü ve Güvenliği
Temel Kavramlar
🔒

Bütünlük (Integrity)

Veritabanının yanlışlıkla yapılan bir güncelleme sonucunda hatalı veya tutarsız hale gelmemesi gerekir. Örnek: yazım hatası, yanlış anlama.

🛡️

Güvenlik (Security)

Veriler yetkisiz kişiler tarafından erişilemez olmalıdır. Bu kişiler meraklı mevcut kullanıcılar ya da kötü niyetli kullanıcılar olabilir.

📚 Bu Derste İşlenecek 3 Ana Konu
  • Assertions (Onaylamalar) — Tüm tablolara veya birden fazla tabloya uygulanan kısıtlamalar
  • Triggers (Tetikleyiciler) — Belirli olaylar gerçekleştiğinde otomatik çalışan eylemler
  • Authorization (Yetkilendirme) — Kullanıcıların erişim haklarının yönetimi
2
Kısıtlamalar
Constraints

Bir kısıtlama (constraint), veritabanındaki tabloların bulunabileceği izin verilen durumları tanımlar.

Bir kullanıcı güncelleme ifadesi gönderdiğinde, veritabanı sistemi önce talep edilen değişiklikleri kısıtlamalarla karşılaştırır; ihlal yoksa güncellemeyi gerçekleştirir.

📝

Bireysel Kayıt Kısıtlaması

Tek bir satıra uygulanır.

"Öğrencinin mezuniyet yılı en az 1863 olmalı"

📋

Tablo Kısıtlaması

Tüm tablo üzerinde geçerlidir.

"Bir öğretim görevlisi yılda en fazla 2 bölüm verebilir"

🗃️

Veritabanı Kısıtlaması

Birden fazla tablo arasında geçerlidir.

"Bir öğrenci aynı dersi birden fazla alamaz"

ℹ️ Bu Derste Neden Bütünlük Kısıtlamaları?

Bu derste özellikle bütünlük kısıtlamaları (integrity constraints) ile ilgileniyoruz. Bu kısıtlamalar iş kurallarını kodlar ve hatalı veri girişini engeller.

3
Bütünlük Kısıtlamaları
Integrity Constraints
🏢 İş Kuralları

Bir bütünlük kısıtlaması, kuruluşun "iş kurallarını" kodlar. İki amacı vardır:

  • Hatalı veri girişini tespit eder
  • Kuruluşun kurallarını uygular

Bir CREATE TABLE ifadesi içinde bütünlük kısıtlaması belirtebiliriz:

SQL · Örnek STUDENT tablosunun SQL tanımı (Şekil 2-4)
CREATE TABLE STUDENT (
    SId      INT          NOT NULL,
    SName    VARCHAR(10) NOT NULL,
    MajorId  INT,
    GradYear INT,

    PRIMARY KEY (SId),
    FOREIGN KEY (MajorId) REFERENCES DEPT
        ON DELETE CASCADE
        ON DELETE SET NULL,
    CHECK (SId > 0),          -- Bireysel kayıt kısıtlaması
    CHECK (GradYear >= 1863)  -- Bireysel kayıt kısıtlaması
);
⚠️ CREATE TABLE'ın Sınırlaması

Bir CREATE TABLE ifadesi, tüm tabloya veya birden fazla tabloya uygulanan bir bütünlük kısıtlaması belirleyebilir mi?

HAYIR! Yalnızca tablodaki bireysel kayıtlara uygulanan kısıtlamalar belirtilebilir. Tüm tablo veya birden fazla tablo için Assertion kullanmak gerekir.

4
Onaylamalar (Assertions)
Tablo Genelinde Kısıtlamalar

Bir assertion (onaylama), veritabanı tarafından her zaman sağlanması gereken bir önermedir (predicate).

Sözdizimi: CREATE ASSERTION ad CHECK (predicate)

En yaygın kullanım: NOT EXISTS Q — Q sorgusu ihlalleri bulur, NOT EXISTS ise ihlal olmadığını doğrular.

Örnek 1 — Tek Tabloya Uygulanan Assertion

SQL · Assertion "Hiçbir bölümde 30'dan fazla öğrenci olamaz" (Şekil 5-1)
CREATE ASSERTION SmallSections
    CHECK (NOT EXISTS (
        SELECT e.SectionId
        FROM   ENROLL e
        GROUP BY e.SectionId
        HAVING COUNT(e.EId) > 30
    ));

Örnek 2 — Tek Tabloya Uygulanan Assertion

SQL · Assertion "Öğrencinin mezuniyet yılı en az 1863 olmalı" (Şekil 5-2)
CREATE ASSERTION ValidGradYear
    CHECK (NOT EXISTS (
        SELECT s.*
        FROM   STUDENT s
        WHERE  s.GradYear < 1863
    ));

Örnek 3 — Birden Fazla Tabloya Uygulanan Assertion

SQL · Assertion "Öğrenciler bir dersi en fazla bir kez alabilir" (Şekil 5-3)
CREATE ASSERTION NoTakeTwice
    CHECK (NOT EXISTS (
        SELECT e.StudentId, k.CourseId
        FROM   SECTION k, ENROLL e
        WHERE  k.SectId = e.SectionId
        GROUP BY e.StudentId, k.CourseId
        HAVING COUNT(k.SectId) > 1
    ));
🔴 Oracle'da Assertion Yok!

Oracle'da CREATE ASSERTION komutu bulunmamaktadır. DBMS'ler SQL standartlarındaki tüm özellikleri uygulamak zorunda değildir. Oracle'da bu kısıtlamalar genellikle tetikleyiciler (triggers) ile simüle edilir.

💡 NOT EXISTS Mantığı
  • Q sorgusu ihlalleri bulur (örn. 30'dan fazla öğrencisi olan bölümler)
  • NOT EXISTS Q ifadesi, bu ihlallerin var olmadığını doğrular
  • Sorgu boş sonuç döndürürse TRUE — kısıtlama sağlanıyor
  • Sorgu sonuç döndürürse FALSE — kısıtlama ihlal ediliyor
5
Tetikleyiciler (Triggers)
Olay Tabanlı Otomatik Eylemler

Bir tetikleyici (trigger), belirli bir olay gerçekleştiğinde veritabanı sisteminin otomatik olarak çalıştırdığı bir eylem tanımlar.

Tetikleyicinin 3 Temel Bileşeni

E
Olay (Event) Etkinliği başlatan güncelleme ifadesi. INSERT, DELETE veya UPDATE gibi bir DML işlemi olabilir.
C
Koşul (Condition) Tetikleyicinin çalışıp çalışmayacağını belirleyen önerme (predicate). WHEN bloğu içinde belirtilir.
A
Eylem (Action) Tetikleyici çalıştığında gerçekleşen şey. Birden fazla SQL ifadesi BEGIN...END blokları içinde yazılabilir.

SQL Tetikleyici Sözdizimi (Genel)

SQL · Syntax Standart SQL tetikleyici yapısı
CREATE TRIGGER trigger_adi
    {BEFORE | AFTER} {INSERT | DELETE | UPDATE} [OF sutun_adi] ON tablo_adi
    [REFERENCING <eski veya yeni değer alias listesi>]
    [FOR EACH ROW]           -- Eylem her değiştirilen satıra uygulanır
    [WHEN koşul]
    eylem;                    -- Birden fazla ifade için BEGIN...END kullan

BEFORE vs AFTER

  • BEFORE: Güncelleme uygulanmadan önce tetikler
  • AFTER: Güncelleme uygulandıktan sonra tetikler

FOR EACH ROW

  • Belirtilirse: Her değiştirilen satır için çalışır
  • Belirtilmezse: İfade başına bir kez çalışır

Örnek 1 — Not Değişikliklerini Loglama

SQL · Trigger Örneği Öğrenci not değişikliklerini kaydeden tetikleyici (Şekil 5-4)
CREATE TRIGGER LogGradeChange
    AFTER UPDATE OF Grade ON ENROLL
    REFERENCING OLD ROW AS oldrow, NEW ROW AS newrow
    FOR EACH ROW
    WHEN (oldrow.Grade <> newrow.Grade)   -- Sadece gerçekten değiştiğinde
        INSERT INTO GRADE_LOG(UserName, DateChanged, EId, OldGrade, NewGrade)
        VALUES(CURRENT_USER, CURRENT_DATE, newrow.EId, oldrow.Grade, newrow.Grade);

Örnek 2 — Boş Bölümü Silme

SQL · Trigger Örneği Son kaydı silinince bölümü de silen tetikleyici
-- Bir ENROLL kaydı silindiğinde, bağlı SECTION kaydı boş kaldıysa onu da sil
CREATE TRIGGER DeleteEmptySection
    AFTER DELETE ON ENROLL
    REFERENCING OLD ROW AS oldrow
    FOR EACH ROW
    DELETE FROM SECTION
    WHERE  SectId = oldrow.SectionId
    AND    SectId NOT IN (SELECT SectionId FROM ENROLL);
6
Oracle'da Tetikleyiciler
Oracle Triggers — PL/SQL

Oracle'da tetikleyiciler PL/SQL bloklarını kullanır ve standart SQL sözdiziminden bazı farklılıklar içerir. Uygulamalar önemli ölçüde değişiklik gösterir.

Oracle Tetikleyici Sözdizimi

Oracle PL/SQL · Syntax Oracle tetikleyici genel yapısı
CREATE [OR REPLACE] TRIGGER trigger_adi
    {BEFORE | AFTER} {INSERT | DELETE | UPDATE} [OF sutun_adi] ON tablo_adi
    [REFERENCING OLD AS oldrow NEW AS newrow]
    [FOR EACH ROW]
    [ENABLE / DISABLE]       -- Oracle'a özgü: aktif/pasif
    [WHEN koşul]
BEGIN
    çalıştırılabilir ifadeler;  -- :new.sutun ve :old.sutun kullanımı
END;

✅ Oracle'a Özgü Özellikler

  • :new.sutun_adi — Yeni değer
  • :old.sutun_adi — Eski değer
  • ENABLE / DISABLE — Aktif/pasif yönetimi
  • OR REPLACE — Varsa üzerine yaz
  • WHEN koşulunda kolon referansları new.col (iki nokta olmadan)

🔄 Enable / Disable

  • Tetikleyici aktifken veritabanı onu otomatik çalıştırır
  • Tetikleyici pasifken çalışmaz; tetikleme olayı gerçekleşse bile
  • Toplu veri yükleme gibi özel durumlarda pasif yapılabilir

Örnek 1 — Maaş Güncellenince Komisyon Hesaplama

Oracle PL/SQL · Örnek Maaş 3000'i aşarsa komisyonu güncelle
CREATE OR REPLACE TRIGGER CommUpdate
    BEFORE UPDATE OF sal ON emp
    FOR EACH ROW
    WHEN (new.sal > 3000)   -- WHEN'de kolon adı iki nokta olmadan
BEGIN
    :new.comm := :old.sal / 20;  -- :new ve :old iki nokta ile
END;

Örnek 2 — Departman Silinince Çalışanları da Sil

Oracle PL/SQL · Örnek Departman silindiğinde bağlı çalışanları otomatik sil
CREATE OR REPLACE TRIGGER DeleteDept
    BEFORE DELETE ON dept
    FOR EACH ROW
BEGIN
    DELETE FROM emp
    WHERE deptno = :old.deptno;  -- Silinen departmanın çalışanlarını sil
END;
📌 :new ve :old Farkı
  • :new.sutun → Güncelleme sonrası sütunun yeni değeri (INSERT ve UPDATE'te kullanılır)
  • :old.sutun → Güncelleme öncesi sütunun eski değeri (DELETE ve UPDATE'te kullanılır)
  • WHEN koşulunda iki nokta olmadan yazılır: new.sal
  • BEGIN...END bloğu içinde iki nokta ile yazılır: :new.sal
7
Tetikleyiciler ve Kısıtlamalar Arasındaki Farklar
Triggers vs Constraints

📏 Kısıtlamalar (Constraints)

  • Yazımı daha kolay ve hata yapma riski düşük
  • Kısıtlamayı ihlal eden her güncellemeyi reddeder
  • Bireysel kayıt ve basit tablo kuralları için idealdir
  • Aynı kuralı uygulayan tetikleyicilerden daha güvenilir

⚡ Tetikleyiciler (Triggers)

  • Kısıtlamaların yapamayacağı karmaşık iş kurallarını uygulayabilir
  • SQL kısıtlama mekanizmasıyla belirtilemeyen bütünlük kısıtlamalarını hayata geçirebilir
  • Hatalı güncellemeyi düzeltebilir (reddetmek yerine)
  • Yan etki üretme yeteneği (loglama, bildirim vb.)
✅ Ne Zaman Hangisini Kullanmalı?
  • Basit kısıtlamalar (NULL, UNIQUE, CHECK, FK) → CONSTRAINT
  • Tablo/veritabanı genelindeki kurallarASSERTION (destekleniyorsa)
  • Olay bazlı mantık (loglama, hesaplama, cascade işlemleri) → TRIGGER
  • Oracle'da assertion gerektiren kurallarTRIGGER
8
Yetkilendirme (Authorization)
Ayrıcalıklar, Roller ve Erişim Kontrolü

Kısıtlamalar ve tetikleyiciler, iyi niyetli ama sorunlu güncellemeleri yakalayarak veritabanını bozulmaktan korur.

Yetkilendirme ise şunları sağlar: kötü niyetli kullanıcıların kasıtlı bozmasını ve meraklı kullanıcıların özel verilere bakmasını engeller.

SQL Ayrıcalık (Privilege) Türleri

Ayrıcalık Açıklama Örnek
SELECT Tablodaki verileri okuma izni GRANT SELECT ON COURSE TO public
INSERT Tabloya yeni kayıt ekleme izni GRANT INSERT ON SECTION TO admissions
DELETE Tablodan kayıt silme izni GRANT DELETE ON STUDENT TO dean
UPDATE Tablodaki verileri güncelleme izni GRANT UPDATE ON ENROLL TO professor
REFERENCES Tabloyu referans alan kısıt oluşturma GRANT REFERENCES ON STUDENT TO dean

Kullanıcılar ve Roller

👥 Kullanıcı (User) vs Rol (Role)
  • Kullanıcı → Veritabanına giriş yapan bireysel kişi
  • Rol → Bir kullanıcı kategorisi (örn. professor, dean, registrar)
  • Bir ayrıcalık kullanıcıya veya role atanabilir
  • Birden fazla iş fonksiyonu olan kullanıcı birden fazla role atanır; ayrıcalıkları her iki rolün birleşimidir

Üniversite Veritabanı Rol Örneği

dean
STUDENT: SELECT, DELETE, UPDATE
ENROLL: SELECT
SECTION: SELECT
admissions
STUDENT: SELECT, INSERT
registrar
COURSE: SELECT, INSERT, DELETE, UPDATE
ENROLL: INSERT, DELETE
SECTION: tüm haklar
professor
ENROLL: SELECT, UPDATE(Grade)
SECTION: SELECT

Sütun Düzeyinde Ayrıcalıklar

SQL · Column Privileges Belirli sütunlara erişim kontrolü
-- StudentId ve Grade sütunları gizli tutulur (dean ve professor'a özel)
GRANT SELECT (StudentId, Grade) ON ENROLL TO dean, professor;

-- EId ve SectionId herkese açık
GRANT SELECT (EId, SectionId) ON ENROLL TO PUBLIC;

-- Professor sadece Grade sütununu güncelleyebilir
GRANT UPDATE (Grade) ON ENROLL TO professor;

-- Admissions sadece SName ve MajorId ekleyebilir
GRANT INSERT (SName, MajorId) ON STUDENT TO admissions;

İfade Yetkilendirmesi — Hangi İfade Hangi Yetkiyi Gerektirir?

İfade Gerekli Ayrıcalıklar
SELECT Sorguda geçen her alan için SELECT yetkisi
INSERT Eklenecek alanlar için INSERT yetkisi + WHERE koşulundaki her alan için SELECT yetkisi
UPDATE Değiştirilecek alanlar için UPDATE yetkisi + WHERE koşulundaki her alan için SELECT yetkisi
DELETE Tablo için DELETE yetkisi + WHERE koşulundaki her alan için SELECT yetkisi

Grant Option — Yetki Devretme

🔑 Grant-Option Ayrıcalığı

Tablo yaratıcısı sahip olduğu ayrıcalıkları başkalarına verebilir. Ayrıca bu ayrıcalıkları devretme yetkisini de verebilir:

SQL · Grant Option Yetki devretme örneği
-- admissions hem INSERT yapabilir hem de başkasına INSERT yetkisi verebilir
GRANT INSERT ON STUDENT TO admissions WITH GRANT OPTION;
⚠️ İsteğe Bağlı Erişim Kontrolü (DAC)

SQL'in yetkilendirme mekanizması Discretionary Access Control (DAC) olarak adlandırılır. Tablo yaratıcısı erişimi kendi takdirine göre yetkilendirir. Bu sistemde kullanıcıların güvenilir olması beklenir — çünkü profesör kendi oluşturduğu tabloya herkesin erişimine izin verebilir (bkz. TakeAPeek örneği).

9
Zorunlu Erişim Kontrolü
Mandatory Access Control (MAC)

DAC'ın zayıflığı: Bir profesör gizli not verilerini başka bir tabloya kopyalayıp herkese açabilir. Bu DAC'ın doğasında var olan bir güvenlik açığıdır.

Zorunlu Erişim Kontrolü (MAC) bu sorunu tablolar yerine verinin kendisine ayrıcalık atayarak çözer.

🔓 Discretionary (DAC)

  • SQL'in varsayılan mekanizması
  • Tablo yaratıcısı kendi takdirine göre yetkilendirir
  • Ticari veritabanlarında yaygın
  • Kullanıcıların güvenilir olduğu varsayılır
  • Veri kopyalanarak güvenlik atlatılabilir

🔐 Mandatory (MAC)

  • Her kayda bir sınıflandırma düzeyi atanır
  • Her kullanıcıya bir sınıflandırma düzeyi atanır
  • Kullanıcı kaydın düzeyine eşit veya daha yüksek düzeydeyse görebilir
  • Veri kopyalansa bile gizlilik korunur
  • Askeri sistemler için uygun
🏷️ Sınıflandırma Düzeyleri (Örnek)
  • TOP SECRET → En üst düzey
  • SECRET → Gizli
  • CONFIDENTIAL → Hassas
  • UNCLASSIFIED → Herkese açık

Bir kullanıcı SECRET düzeyindeyse SECRET ve CONFIDENTIAL ve UNCLASSIFIED kayıtları görebilir, TOP SECRET'ı göremez.

🏢 Oracle Label Security

Oracle Enterprise Edition için bir eklenti güvenlik seçeneği olan Oracle Label Security, kendi etiket tabanlı erişim kontrol politikalarınızı özelleştirmenizi sağlar. Öncelikle askeri gibi yüksek güvenlikli sistemler için uygundur. Ticari veritabanları bu mekanizmayı nadiren kullanır.

⚠️

DAC Güvenlik Açığı

Profesör ENROLL'dan gizli verileri okuyup kendi oluşturduğu TakeAPeek tablosuna kopyalayabilir ve herkese açabilir — DAC bunu engellemiyor.

🛡️

MAC ile Çözüm

MAC'ta veri ENROLL'dan başka tabloya kopyalansa bile sınıflandırma etiketi veriyle birlikte taşınır ve gizliliği korunur.

📖
Genel Özet
Tüm Konuların Karşılaştırması
Mekanizma Amaç Kapsam Oracle Desteği
CHECK Constraint Bireysel kayıt doğrulama Tek satır ✓ TAM
PRIMARY KEY / FK Referans bütünlüğü Tablo/Tablolar arası ✓ TAM
ASSERTION Karmaşık bütünlük kuralları Tablo / Çoklu tablo ✗ YOK
TRIGGER Olay bazlı otomatik eylem Tablo / Veritabanı ✓ TAM (PL/SQL)
GRANT / REVOKE Erişim kontrolü (DAC) Tablo / Sütun ✓ TAM
MAC (Label Security) Veri düzeyinde gizlilik Satır / Kayıt ~ EK SEÇENEK