Veritabanlarında veri bütünlüğünü koruma ve güvenliği sağlama yöntemleri — kısıtlamalar, onaylamalar, tetikleyiciler ve yetkilendirme.
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.
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.
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.
Tek bir satıra uygulanır.
"Öğrencinin mezuniyet yılı en az 1863 olmalı"
Tüm tablo üzerinde geçerlidir.
"Bir öğretim görevlisi yılda en fazla 2 bölüm verebilir"
Birden fazla tablo arasında geçerlidir.
"Bir öğrenci aynı dersi birden fazla alamaz"
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.
Bir bütünlük kısıtlaması, kuruluşun "iş kurallarını" kodlar. İki amacı vardır:
Bir CREATE TABLE ifadesi içinde bütünlük kısıtlaması belirtebiliriz:
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ı );
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.
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.
CREATE ASSERTION SmallSections CHECK (NOT EXISTS ( SELECT e.SectionId FROM ENROLL e GROUP BY e.SectionId HAVING COUNT(e.EId) > 30 ));
CREATE ASSERTION ValidGradYear CHECK (NOT EXISTS ( SELECT s.* FROM STUDENT s WHERE s.GradYear < 1863 ));
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 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.
TRUE — kısıtlama sağlanıyorFALSE — kısıtlama ihlal ediliyorBir tetikleyici (trigger), belirli bir olay gerçekleştiğinde veritabanı sisteminin otomatik olarak çalıştırdığı bir eylem tanımlar.
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
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);
-- 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);
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.
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;
:new.sutun_adi — Yeni değer:old.sutun_adi — Eski değerENABLE / DISABLE — Aktif/pasif yönetimiOR REPLACE — Varsa üzerine yaznew.col (iki nokta olmadan)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;
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.sal:new.salKı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.
| 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 |
-- 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 | 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 |
Tablo yaratıcısı sahip olduğu ayrıcalıkları başkalarına verebilir. Ayrıca bu ayrıcalıkları devretme yetkisini de verebilir:
-- admissions hem INSERT yapabilir hem de başkasına INSERT yetkisi verebilir GRANT INSERT ON STUDENT TO admissions WITH GRANT OPTION;
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).
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.
Bir kullanıcı SECRET düzeyindeyse SECRET ve CONFIDENTIAL ve UNCLASSIFIED kayıtları görebilir, TOP SECRET'ı göremez.
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.
Profesör ENROLL'dan gizli verileri okuyup kendi oluşturduğu TakeAPeek tablosuna kopyalayabilir ve herkese açabilir — DAC bunu engellemiyor.
MAC'ta veri ENROLL'dan başka tabloya kopyalansa bile sınıflandırma etiketi veriyle birlikte taşınır ve gizliliği korunur.
| 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 |