---
title: 'Yetki Verme ve Alma'
source: 'https://academia.sh/tr/kurslar/sql-temelleri/yetki-verme-ve-alma'
course: 'SQL Temelleri'
language: tr
updated: '2026-08-17T18:09:02+00:00'
license: 'CC BY-SA 4.0'
---

# Yetki Verme ve Alma

Nesne düzeyi izinlerin standart SQL yazımı, yetkili-nesne-izin üçlüsü, aktarım seçeneği ve rol kavramı; en az yetki ilkesinin bir yetki matrisi üzerinde ölçülmesi.

Önceki ders görünümün ikinci işini yarım bıraktı. Görünüm okuyucuya temel tablonun
yalnızca bir bölümünü gösterebilir — ama gösterebilmesi, temel tablonun gizlendiği
anlamına gelmez. Görünümü sorgulayan biri, isterse aynı bağlantıda temel tabloyu da
sorgular. Eksik olan, kimin neyi görebileceğini söyleyen ayrı bir mekanizmadır.

SQL Dil Aileleri dersinde ayrılan beş aileden dördüncüsü — veri denetim dili — tam olarak
bunu yazar. Deyimleri kısadır, kavramları ise şema tasarımı kadar sonuç doğurur: bir
sistemdeki en pahalı hataların bir bölümü, gereğinden geniş verilmiş izinlerden çıkar.

## Yetki Modelinin Parçaları

Nesne düzeyi yetkilendirme üç şeyi birbirine bağlar.

**Yetkili**, izni alan taraftır: bir kullanıcı hesabı, bir rol ya da "herkes" anlamına
gelen genel bir ad. **Nesne**, iznin üzerinde tanımlandığı şeydir: tablo, görünüm, sütun,
şema ya da veritabanının kendisi. **İzin**, o nesnede yapılabilecek işlemi adlandırır:
okuma, ekleme, güncelleme, silme, başvurma, tanım değiştirme.

Bu üçlünün her bir bileşimi ayrı bir yetkidir. Bir tabloda okuma izni olan bir yetkilinin
aynı tabloda yazma izni yoktur; bunun için ayrıca verilmesi gerekir.

Yetkiyi kim verir sorusunun standart yanıtı nesnenin sahibidir: bir tabloyu yaratan
taraf, o tablo üzerinde bütün izinlere ve bu izinleri başkalarına verme hakkına baştan
sahiptir.

## Yetki Vermek ve Geri Almak

Standart SQL'de izinler `GRANT` ile verilir, `REVOKE` ile geri alınır.

```sql
GRANT SELECT, INSERT, UPDATE ON odunc TO gorevli;
GRANT SELECT ON uye_ozeti TO rapor;
GRANT SELECT (uye_id, ad, soyad) ON uye TO rapor;
GRANT SELECT ON kitap TO katalog WITH GRANT OPTION;

REVOKE DELETE ON odunc FROM gorevli;
REVOKE ALL PRIVILEGES ON uye FROM rapor CASCADE;
```

Deyimler okunduğu gibi çalışır: hangi izinler, hangi nesne üzerinde, kime. İkinci satırdaki
nesne bir tablo değil, önceki derste tanımlanan görünümdür — izin, tablolarda olduğu gibi
görünümler üzerinde de verilir. Üçüncü satır izni sütun düzeyinde daraltır: yetkili
tabloyu sorgulayabilir ama yalnızca sayılan sütunları görür, e-posta adresine erişemez.
Dördüncü satırdaki **aktarım seçeneği**, yetkiliye aldığı izni başkalarına verme hakkını
da tanır.

Geri almanın iki inceliği vardır. `ALL PRIVILEGES`, o nesnede yetkiliye verilmiş bütün
izinleri kapsar. `CASCADE` ise aktarım seçeneğiyle verilmiş bir iznin dallanmasını
izler: yetkili o izni başkalarına dağıttıysa, geri alma o dağıtımları da kaldırır. Bu
seçenek yazılmazsa ve dallanma varsa, standart geri almayı reddeder — çünkü sessizce
bırakılan bir dal, geri alındığı sanılan bir izin demektir.

Aktarım seçeneği bu yüzden ölçülü kullanılır. Bir izni kimin dağıtabileceği,
dağıtılabilecek izinlerin kendisinden daha önemli bir karardır: aktarım hakkı verilen her
yetkili, yetki matrisini tek başına genişletebilecek bir noktadır.

Rol kavramı, aynı sorunu daha yönetilebilir kılar. İzinler tek tek kullanıcılara değil
role verilir, kullanıcılar role bağlanır. Bir görev tanımı değiştiğinde tek bir rolün
izinleri düzenlenir; işe yeni başlayan biri role bağlanarak bütün izinleri devralır. Rol
olmadan, izinler kullanıcı sayısıyla çarpılır ve kimsenin tam olarak neye erişebildiği
izlenemez olur.

Bu deyimlerin **her motorda bulunmadığı** vurgulanmalıdır. Kullanıcı hesabı kavramı
olmayan motorlar vardır; bu dersin komut satırı aracı da böyledir ve `GRANT` deyimini
ayrıştıramaz. Erişim denetimi orada dosya sistemi izinlerine ve uygulama katmanına
bırakılır. Yetkilendirmenin nerede yapıldığı, motor seçilirken sorulacak sorulardandır.

## En Az Yetki İlkesini Ölçmek

Linux'a Giriş kursunda tanıtılan en az yetki ilkesi burada da geçerlidir: her yetkiliye,
işini yapmak için gereken izinlerden fazlası verilmez. İlkenin uygulandığı iddia edilmez,
**sayılır**. Verilen izinler ve işin gerektirdiği izinler iki küme olarak yazılırsa, fark
doğrudan hesaplanabilir.

Aşağıdaki betik kütüphane veritabanı için bu iki kümeyi kurar, matrisi yazdırır ve
farkları sayar. Sonra fazla verilmiş izinleri geri alıp matrisi yeniden çıkarır.

```sh
cat > yetki.mjs <<'EOF'
// Nesne duzeyi yetki matrisini kurar ve en az yetki ilkesinin ihlallerini sayar.
const izinler  = ["SELECT", "INSERT", "UPDATE", "DELETE"];
const nesneler = ["uye", "kitap", "odunc", "uye_ozeti"];

// GRANT ile verilmis yetkiler: "yetkili nesne izin"
const verilen = new Set([
  "gorevli uye SELECT",   "gorevli uye UPDATE",   "gorevli kitap SELECT",
  "gorevli odunc SELECT", "gorevli odunc INSERT",
  "gorevli odunc UPDATE", "gorevli odunc DELETE", "gorevli uye_ozeti SELECT",
  "rapor uye SELECT",     "rapor kitap SELECT",   "rapor odunc SELECT",
  "rapor odunc DELETE",   "rapor uye_ozeti SELECT",
  "katalog kitap SELECT", "katalog kitap INSERT", "katalog kitap UPDATE",
]);

// Isin gerektirdigi yetkiler.
const gereken = new Set([
  "gorevli uye SELECT",   "gorevli uye UPDATE",   "gorevli kitap SELECT",
  "gorevli odunc SELECT", "gorevli odunc INSERT",
  "gorevli odunc UPDATE", "gorevli uye_ozeti SELECT",
  "rapor uye_ozeti SELECT",
  "katalog kitap SELECT", "katalog kitap INSERT", "katalog kitap UPDATE",
]);

const yetkililer = [...new Set([...verilen].map((k) => k.split(" ")[0]))];

function raporla(baslik, kume) {
  console.log(baslik);
  console.log(("  yetkili  nesne      " + izinler.map((i) => i.padEnd(7)).join("")).trimEnd());
  for (const y of yetkililer) {
    for (const n of nesneler) {
      const hucre = izinler.map((i) => {
        const v = kume.has(`${y} ${n} ${i}`);
        const g = gereken.has(`${y} ${n} ${i}`);
        return (v ? (g ? "var" : "FAZLA") : g ? "EKSIK" : "-").padEnd(7);
      });
      console.log(("  " + y.padEnd(9) + n.padEnd(11) + hucre.join("")).trimEnd());
    }
  }
  const fazla = [...kume].filter((k) => !gereken.has(k));
  const eksik = [...gereken].filter((k) => !kume.has(k));
  console.log(`  fazla verilmis yetki: ${fazla.length}`);
  for (const k of fazla) console.log("    " + k);
  console.log(`  eksik yetki: ${eksik.length}`);
  return fazla;
}

const fazla = raporla("== REVOKE oncesi ==", verilen);
const sonra = new Set([...verilen].filter((k) => !fazla.includes(k)));
raporla("== REVOKE sonrasi ==", sonra);
EOF
node yetki.mjs
```

```
== REVOKE oncesi ==
  yetkili  nesne      SELECT INSERT UPDATE DELETE
  gorevli  uye        var    -      var    -
  gorevli  kitap      var    -      -      -
  gorevli  odunc      var    var    var    FAZLA
  gorevli  uye_ozeti  var    -      -      -
  rapor    uye        FAZLA  -      -      -
  rapor    kitap      FAZLA  -      -      -
  rapor    odunc      FAZLA  -      -      FAZLA
  rapor    uye_ozeti  var    -      -      -
  katalog  uye        -      -      -      -
  katalog  kitap      var    var    var    -
  katalog  odunc      -      -      -      -
  katalog  uye_ozeti  -      -      -      -
  fazla verilmis yetki: 5
    gorevli odunc DELETE
    rapor uye SELECT
    rapor kitap SELECT
    rapor odunc SELECT
    rapor odunc DELETE
  eksik yetki: 0
== REVOKE sonrasi ==
  yetkili  nesne      SELECT INSERT UPDATE DELETE
  gorevli  uye        var    -      var    -
  gorevli  kitap      var    -      -      -
  gorevli  odunc      var    var    var    -
  gorevli  uye_ozeti  var    -      -      -
  rapor    uye        -      -      -      -
  rapor    kitap      -      -      -      -
  rapor    odunc      -      -      -      -
  rapor    uye_ozeti  var    -      -      -
  katalog  uye        -      -      -      -
  katalog  kitap      var    var    var    -
  katalog  odunc      -      -      -      -
  katalog  uye_ozeti  -      -      -      -
  fazla verilmis yetki: 0
  eksik yetki: 0
```

Beş ihlal çıktı ve her biri ayrı bir gerekçeyle açıklanabilir.

`gorevli odunc DELETE` izni, bir önceki dersin sonucudur: ödünç kaydı silmek geçmişi yok
eder, iade işlemi ise kaydı güncelleyerek yapılır. Görevlinin silme iznine gereksinimi
yoktur.

`rapor` yetkilisinin üç temel tabloda okuma izni ise daha ilginçtir. Raporlama işinin
gerçekten okumaya gereksinimi vardır — ama temel tablolara değil, `uye_ozeti`
görünümüne. İzin görünümde verildiğinde raporlama yine çalışır, üye tablosundaki
e-posta adresleri ise erişilebilir olmaktan çıkar. Önceki dersin yarım kalan düşüncesi
burada tamamlanır: **görünüm neyin gösterileceğini tanımlar, yetki onu bağlayıcı kılar.**
İkisi ayrı ayrı eksiktir.

`rapor odunc DELETE` izni ise hiçbir gerekçeyle açıklanamaz; büyük bir olasılıkla bir
kopyalama artığıdır. Yetki matrisleri elle büyüdükçe bu tür artıklar birikir ve
kimsenin farkına varmadığı bir yazma yolu bırakır.

Geri alma sonrasındaki ikinci matriste hem fazla hem eksik yetki sıfırdır: her yetkilinin
izinleri işinin gerektirdiğine eşittir. Bu sayının düzenli olarak hesaplanması, ilkeye
uyulduğunu iddia etmekten farklı bir şeydir.

## Özet

- Nesne düzeyi yetkilendirme yetkili, nesne ve izin üçlüsünü bağlar; her bileşim ayrı bir
  yetkidir ve ayrıca verilmesi gerekir.
- `GRANT` izin verir, `REVOKE` geri alır; izin sütun düzeyinde daraltılabilir, aktarım
  seçeneğiyle genişletilebilir ve geri alma dallanmayı izleyecek biçimde yazılabilir.
- Roller izinleri kullanıcılardan ayırır; görev tanımı değiştiğinde tek bir rolün izinleri
  düzenlenir ve erişim izlenebilir kalır.
- Görünüm neyin gösterileceğini tanımlar, yetki onu bağlayıcı kılar; erişim daraltmak
  için ikisi birlikte kullanılır.
- En az yetki ilkesi iddia edilmez, sayılır: verilen izinler ile işin gerektirdiği
  izinlerin farkı hesaplanabilir bir büyüklüktür.

## Kurs Kapanışı

Bu kurs SQL'in temel deyimlerini kurdu. Sorgulama konusunda `SELECT` yapısı, koşullar,
sıralama, boş değerlerle çalışma ve yerleşik işlevler ele alındı. Birleştirmeler konusu
tabloları iç ve dış birleştirmelerle bir araya getirdi, toplama işlevleri ve gruplamayla
özet üretti, küme işlemleriyle sonuç kümelerini birleştirdi. Bu konu ise okumadan yazmaya
geçti: şemanın tanımlanması ve kısıtlarla korunması, şemanın değiştirilmesi, satır
ekleme, güncelleme ve silmenin riskleri, görünümler ve nesne düzeyi izinler.

Kurs boyunca tek bir örnek sürdü — şubeleri, üyeleri, kitapları ve ödünç işlemleri olan
bir kütüphane veritabanı. Aynı şema üzerinde hem sorgular hem yazma deyimleri yazıldı;
kısıtların neyi engellediği, koşulsuz bir güncellemenin ne yaptığı ve bir görünümün
neyi gizleyip neyi gizlemediği aynı tablolarda görüldü.

Sıradaki kurs İleri SQL, buradaki deyimleri üç yönde derinleştirir. Bileşik sorgular
konusu alt sorguları, ortak tablo ifadelerini, özyinelemeli sorguları ve pencere
işlevlerini ele alır — bu kursta alt sorgu yalnızca koşul yazmak için kullanıldı, orada
kendi başına bir yapı olur. İşlemler konusu, bu kursta bir alışkanlık olarak kullanılan
`BEGIN` ve `ROLLBACK` çiftinin altındaki mekanizmayı açar: kaydetme noktaları, yalıtım
düzeyleri, kilitleme ve kilitlenme. Sorgu başarımı konusu ise dizinleri, sorgu planını
okumayı ve planı bozan yazımları ele alır — bu kursta ölçülen ekleme farkının yanına,
okuma tarafının maliyet modeli eklenir.
