|
<< İçindekileri Görüntülemek İçin Tıklayın >> Yer: Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 6. Veri tanımlama (DDL) > 6.5 Yetkilendirme |
GRANT <yetki>[(<kolon> [, …])] [, …] [ON <nesne> [, …]] TO <alıcı> [, …]
[WITH ADMIN OPTION | WITH GRANT OPTION]
REVOKE [GRANT OPTION FOR | ADMIN OPTION FOR] <yetki>[(<kolon> [, …])] [, …] [ON <nesne> [, …]] FROM <alıcı> [, …]
[CASCADE | RESTRICT]Gövde ikisinde aynıdır; alıcı TO yerine FROM'dan sonra gelir. Alıcı
listesi zorunludur (yoksa sözdizimi hatası). … OPTION FOR ile
CASCADE/RESTRICT yalnızca REVOKE'ta geçerlidir — bkz.
“Zincirli iptal”.
Devir ölçütü bağlama göredir ve karıştırılamaz: bir nesne hakkı
GRANT OPTION, bir rol üyeliği ADMIN OPTION alır. Yanlış
sözcüğü yazmak sözdizimi hatasıdır — standardın ve PostgreSQL'in ayrımı budur, ve sessizce kabul
edilseydi GRANT <rol> TO <u> WITH GRANT OPTION yazan biri devir verdiğini
sanıp vermemiş olurdu.
| Bağlam | Veren yazar | Geri alan yazar | Anlamı |
|---|---|---|---|
| nesne hakkı | WITH GRANT OPTION | GRANT OPTION FOR | bu hak başkasına verilebilir |
| rol üyeliği | WITH ADMIN OPTION | ADMIN OPTION FOR | bu rol başkasına verilebilir |
İkisi de aynı yerde saklanır (ivd$grant_option), yani denetim, önbellek ve zincirli
iptal makinesinin tamamı ikisi için de aynı biçimde çalışır. GRANT/REVOKE
yazabilmek için bu ölçüte sahip olmak gerekir; nesnenin ya da rolün sahibi ve
yönetici muafiyetleri bundan bağımsızdır.
Verilen haklar SYS.IVD$OBJECT_PRIVILEGES tablosunda saklanır ve
uygulanır. Denetim koşma anında yapılır, derleme anında değil:
derlenmiş deyim önbelleğe alındığı için derlemede sorulan bir hak, sonradan verilen bir
GRANT'i görmezden gelirdi. Yetersiz hak deyimi no SELECT privilege on …
biçiminde bir hatayla düşürür (SQLSTATE 42501).
Bir satır (nesne, alıcı, veren) üçlüsüdür ve haklar tek bir bit kümesidir:
GRANT kümeye ekler, REVOKE çıkarır, küme boşalınca satır silinir.
Olmayan bir hakkı geri almak satır açmaz. Alıcı bir kullanıcı, bir rol ya da PUBLIC
olabilir; rol üyelikleri geçişli çözülür (rol içinde rol).
Veren de anahtarın parçasıdır: aynı hakkı aynı alıcıya iki ayrı kullanıcı
verdiyse iki ayrı satır oluşur ve alıcının etkin hakkı hepsinin birleşimidir. Bunun iki görünür
sonucu vardır. Birincisi, REVOKE yalnızca çağıranın kendi bağışına
dokunur: başkasının verdiği aynı hak yerinde kalır. İkincisi, bu kayıt olmadan zincirli iptal
kurulamaz — kimin kime verdiği bilinmeden hangi bağışın dayanağının kalktığı da bilinemez.
Verenin boş (NULL) olduğu satırlar motorun bağışlarıdır (önyükleme,
CREATE DATABASE'in sahip satırı, kimliksiz bağlantı) ve geri alınamazlar.
“Herhangi bir kolon yeter” kuralı yalnızca okumadadır:
adlı bir kolona dokunmayan deyim herhangi bir kolondaki SELECT ile geçer;
INSERT/UPDATE/DELETE için tablo düzeyindeki hak şarttır.
Çözülemeyen (bilinmeyen) bir hedefte cevap “izin yok”tur.
Kolon hakkı tabloya düşer: bir kullanıcının t.a
kolonunda SELECT (ya da GRANT OPTION) taşıyıp taşımadığı sorulduğunda
tablo düzeyindeki satır ve tablonun sahipliği de sayılır — çalışma anı denetiminin izlediği sıra.
Bu yüzden tablonun sahibinin verdiği kolon hakları zincirli REVOKE'ta
“sahipsiz” sayılmaz.
Dört hak kolon listesi alır: SELECT, INSERT, UPDATE ve
REFERENCES — standardın dörtlüsü, PostgreSQL ve SQL Server da aynısını alır.
DELETE almaz, çünkü silinen şey satırın tamamıdır; kolon kabul etmeyen bir hakka liste
yazmak sözdizimi hatasıdır, olmayan bir kolon adı da öyle.
GRANT SELECT(ad, soyad), UPDATE(telefon) ON musteri TO temsilci;
REVOKE SELECT(soyad) ON musteri FROM temsilci CASCADE;Ayrı bir yapı yoktur: bu motorda bir kolon birinci sınıf katalog nesnesidir
(kendi nesne kimliğiyle, ivd$type = 'FIELD', sahibi tablo), dolayısıyla kolon hakkı
nesnesi kolon olan sıradan bir hak satırıdır. Zincirli iptal, DROP temizliği
ve önbellek onun için de olduğu gibi çalışır. Bunun görünür sonucu: “bu tabloda ne
verilmiş” sorusu tablonun kolonlarına da bakmak zorundadır.
Denetimin sırası önce tablo, sonra kolondur. Tablo düzeyinde hak varsa soru
biter ve bütün muafiyetler (sahip, SYSDBA, SYSADMIN,
READ_ALL_DATA) olağan biçimde işler. Yalnızca orada hak yoksa kolon düzeyine
inilir ve deyimin dokunduğu her kolon ayrı ayrı aranır; bir kolon bile eksikse
deyim düşer. Hangi kolonlara dokunulduğu deyimin türüne bağlıdır:
| Deyim | Denetlenen kolonlar |
|---|---|
SELECT | o kaynaktan okunan kolonlar. * genişletildikten sonra bakıldığı için yıldız tablonun bütün kolonlarını ister. |
INSERT | yazılan kolon listesi |
UPDATE | SET listesi yazılır; ayrıca okunan kolonlar — bkz. aşağısı |
DELETE | yazma için yok (tablo düzeyinde DELETE gerekir); WHERE'de okunan kolonlar ayrıca SELECT ister |
MERGE | yazılan her WHEN dalı kendi hakkını ve kendi kolon listesini ister — bkz. aşağısı |
UPDATE OR INSERT | hem INSERT hem UPDATE, aynı kolon listesiyle |
| yabancı anahtar | hedef tablonun bağlanılan kolonları |
Bir deyim tablonun hiçbir kolonuna dokunmuyorsa (SELECT count(*) FROM t) tablonun
herhangi bir kolonundaki hak yeter — PostgreSQL'in davranışı. Gerekçesi: bir kolonu
okuyabilen satır sayısını zaten öğrenebilir, ama hiçbir hakkı olmayana satır sayısı sızdırılmamalı.
Bir deyimin yazdığı kolon yazma hakkını, okuduğu kolon ise ayrıca
SELECT hakkını ister. Standardın (SQL:2016, 14.14) ve PostgreSQL, SQL Server ile
MySQL'in kuralı budur. Okunan kolon yalnızca WHERE'de değil, SET'in
değer tarafında ve birleştirme koşullarında da olabilir:
GRANT SELECT(a), UPDATE(a), UPDATE(c) ON t TO u;
UPDATE t SET c = 9; -- hiçbir kolon okunmuyor: SELECT gerekmez
UPDATE t SET a = a + 1; -- a okunuyor: SELECT(a) de gerekir (var)
UPDATE t SET a = b; -- b okunuyor: SELECT(b) yok, deyim düşer
UPDATE t SET c = 9 WHERE b = 2; -- aynı şekilde düşer
DELETE FROM t WHERE b = 2; -- silmek için DELETE, b'yi okumak için SELECT(b)Okuma denetlenmezse UPDATE t SET a = b, okuma hakkı olmayan bir kolonun
değerini okuma hakkı olan bir kolona kopyalar — bu bir çıkarım kanalı değil, kolonun
doğrudan okunmasıdır. Oracle büyük sistemler içinde bunu denetlemeyen tek örnektir
(UPDATE yetkisi WHERE'i tek başına taşır); bu motor okunan kolonu denetler.
RETURNING ile geri dönen her kolon okunmuş sayılır ve
SELECT ister — PostgreSQL de böyle davranır ve yazılan kolona muafiyet tanımaz.
Muafiyet olmamasının somut gerekçesi vardır: dönen değer çağıranın yazdığı değer olmayabilir, araya
bir DEFAULT, bir sıra ya da bir tetikleyici girmiş olabilir.
GRANT INSERT ON t TO u; -- hiçbir kolonda SELECT yok
INSERT INTO t(a, b) VALUES (1, 10); -- geçer
INSERT INTO t(a, b) VALUES (2, 20) RETURNING c; -- SELECT(c) yok: düşer
INSERT INTO t(a, b) VALUES (3, 30) RETURNING b; -- yazılan kolon da SELECT isterRETURNING listesinde doğrudan yazılan kolonlar da bir
ifadenin içindeki kolonlar da (returning c + 0) denetlenir.
MERGE hedef tabloda, yalnızca yazılmış WHEN dallarının
haklarını ister — hepsini değil. PostgreSQL, SQL Server ve Oracle da böyle davranır.
| Dal | Gereken hak | Kolon kümesi |
|---|---|---|
WHEN MATCHED THEN UPDATE | UPDATE | o dalın SET listesi |
WHEN NOT MATCHED THEN INSERT | INSERT | o dalın hedef kolon listesi |
WHEN MATCHED THEN DELETE | DELETE | yok — giden satırın tamamıdır |
Bunlara ek olarak kaynakta SELECT, hedefte ise ON koşulunun,
WHEN koşullarının ve değer ifadelerinin okuduğu kolonlarda
SELECT gerekir. Yani INSERT ve UPDATE hakkı olan bir
kullanıcının MERGE'ü çalışır, ama aynı deyime bir
WHEN MATCHED THEN DELETE dalı eklenirse yalnızca o dal yüzünden reddedilir.
UPDATE OR INSERT adının söylediği gibi iki iş yapar: var olan satırı
güncelleyebildiği için INSERT'ün yanı sıra UPDATE hakkı da ister.
| Hak | Ne verir |
|---|---|
SELECT, INSERT, UPDATE, DELETE |
Saklanan ilişkiden okuma ve ona yazma. |
EXECUTE, USAGE |
Yordam/işlev çağırma; alan tipi (domain, dizi) kullanma. USAGE kimlik bilgisi ve dizin
nesnelerinde de verilir — GRANT USAGE ON CREDENTIAL <ad> TO <rol>: kimlik bilgisini
kullanan yerleşik paketler (örneğin WhatsApp istemcisi) bu hakkı arar. |
ALTER, DROP |
Nesnenin şeklini değiştirmek ve nesneyi düşürmek. İndeks ve kısıt
eklemek/çıkarmak da ALTER'a girer — indeks standartta bir nesne bile değildir ve
yalnızca tablonun fiziksel şeklini değiştirir. |
TRIGGER |
O tabloya tetikleyici koyabilmek. Ayrı bir hak olmasının sebebi gerçektir: tetikleyici, o tabloya kim yazarsa yazsın kendi kodunu çalıştırmak demektir — kolon eklemekten bambaşka bir güç. |
REFERENCES |
O tabloya yabancı anahtar ile bağlanabilmek. Bağlanmak, hedefin satırlarını silinemez kılar. |
CREATE |
Bir kabın içine nesne yaratabilmek: şemada şema nesnesi, veritabanında kullanıcı/rol/şema. |
GRANT ALL nesne haklarını açar — ALTER ve DROP
dahil değildir. Katsalardı her GRANT ALL
sessizce DDL hakkı da vermiş olurdu; standart da ALL PRIVILEGES ile nesne haklarını
kasteder.
Sistem nesneleri: okumak ve kullanmak (SELECT,
EXECUTE, USAGE) herkese açıktır, aralarındaki uygulama tablolarına
(IVD$EVENT_LOG gibi) yazmak serbesttir; ama yapı değişikliği —
ALTER, DROP, sistem şemasının içine CREATE,
TRIGGER, REFERENCES — yalnızca kimliksiz bağlantıya, önyükleme login'i
SYSDBA'ya ve motorun kendi SYSTEM kapsamına açıktır. Sıradan bir login'in
ALTER USER SYSDBA …, ALTER SEQUENCE SYS.IVD$OBJECT_ID … ya da
DROP TABLE SYS.IVD$… yazması 42501 verir; SYSADMIN
muaf değildir (rol üyesi önyükleme login'ini ele geçirebilirdi).
Bir nesneyi yaratmak, onu tutacak kabın hakkını ister;
değiştirmek ve düşürmek nesnenin kendisinde
ALTER / DROP ister.
| Deyim | Nerede hangi hak |
|---|---|
CREATE TABLE/VIEW/PROCEDURE/… | hedef şemada CREATE |
CREATE USER/ROLE/SCHEMA | veritabanında CREATE |
CREATE INDEX, … ADD CONSTRAINT | tabloda ALTER |
CREATE TRIGGER | tabloda TRIGGER |
| yabancı anahtar | hedef tabloda REFERENCES |
ALTER … / DROP … | nesnenin kendisinde ALTER / DROP |
GRANT/REVOKE'un kendisi de denetlenir: bir hakkı başkasına vermek için
o hakkın verende WITH GRANT OPTION ile bulunması (ya da verenin nesnenin sahibi
olması) gerekir. Standardın kuralı budur. Rol vermek de aynı denetimden geçer, ölçütü
rolün üzerindeki ADMIN OPTION'dır — yerleşik roller dahil: SYSADMIN bir
sistem nesnesidir ama rol üyeliği o muafiyetin dışında tutulur, yoksa herkes kendini yönetici
yapabilirdi.
Bir yordam, işlev (toplam işlevler dâhil) ya da tetikleyici gövdesi öndeğerde çağıranın haklarıyla
koşar (INVOKER) — PostgreSQL'in de öndeğeri budur. SQL SECURITY DEFINER
yazılırsa gövde nesnenin sahibinin haklarıyla koşar:
CREATE PROCEDURE gizli_oku RETURNS (v INTEGER)
SQL SECURITY DEFINER
AS
BEGIN
SELECT a FROM gizli INTO :v;
SUSPEND;
END;
GRANT EXECUTE ON PROCEDURE gizli_oku TO temsilci; -- `gizli` tablosunda hak GEREKMEZBu, GRANT EXECUTE'u gerçek bir kapsülleme aracı yapar: yordamı
çağırabilen, yordamın dokunduğu tablolarda ayrıca hak sahibi olmak zorunda değildir. Aynı şey
tetikleyicide denetim günlüğü yazmayı mümkün kılar: bir tabloya
INSERT verilen kişiye, tetikleyicinin yazdığı günlük tablosunda ayrıca hak verilmesi
gerekmez.
Öndeğer INVOKER olduğu için yan tümce yazılmamış nesneler çağıranın haklarıyla koşar.
Görünümler ise her zaman definer'dır (bkz. Görünüm bir yetki aracıdır) — görünümün kendisi zaten bir yetki
aracıdır ve ayrı bir yan tümcesi yoktur.
DENY yokturBu motorda açık bir red yoktur. Model “vermediğin hak zaten yoktur”
modelidir:
DENY yalnızca SQL Server'da bulunur; standart böyle bir yapı
tanımlamaz, PostgreSQL, Oracle, MySQL, Firebird ve DB2 de tanımaz.
Gerekçesi maliyetidir: bir reddin tek varlık sebebi, başka bir yerden — bir
rolden ya da PUBLIC'ten — gelen bağışı yenmesidir. Bu da etkin
hakkı “bağışların birleşimi” olmaktan çıkarıp (bağışların birleşimi) ve
(redlerin birleşimi) değil hâline getirir ve üç şeyi yeniden tanımlar:
PUBLIC'in anlamı: “herkesin taban bağışı”nın yanında
“herkesin taban reddi” olurdu ve açıkça GRANT almış bir kullanıcıyı da
keserdi.SYSADMIN, SYSDBA ve sahibin reddi aşıp
aşmayacağı ayrıca yazılmak zorunda kalırdı.REVOKE: tek sözcük iki ayrı şeyi (bağışı ve reddi) kaldırırdı.DENY bir anahtar sözcük bile değildir, dolayısıyla yazılması sessizce yok sayılmaz:
SYNTAX_ERROR verir. Aynı ihtiyacın karşılanma yolu öteki motorlardakiyle aynıdır:
hakkı role değil kişiye vermek, ya da kişiyi rolden çıkarmak.
Devredilebilir bir hak geri alındığında, o hakka dayanan bağışlar dayanaksız kalır:
A, B'ye WITH GRANT OPTION ile SELECT vermiş, B de C'ye
SELECT vermişse, A'nın geri alması B'nin verme yetkisini de düşürür ve C'nin hakkının
arkasında kimse kalmaz.
Ölçüt tek bir sorudur ve nesne üzerindeki her bağışa sorulur: bu satırın
vereni bu hakkı hâlâ devredebiliyor mu? Edemiyorsa satır dayanaksızdır. Soru böyle
kurulmuştur, çünkü bir alıcı aynı hakkı PUBLIC satırından ya da bir rol üzerinden de
taşıyor olabilir — “kim kimden aldı” tek bir bağla temsil edilmez.
| Yazım | Dayanaksız bağış bulunursa |
|---|---|
CASCADE | Zincirin tamamı düşürülür: dayanaksız her bağış, onlara dayananlarla birlikte silinir. |
RESTRICT (öndeğer) | Deyim dependent privileges on … exist, use CASCADE ile düşer (SQLSTATE 2B000) ve hiçbir şey yazılmaz. |
REVOKE GRANT OPTION FOR <yetki> … — rol üyeliğinde
REVOKE ADMIN OPTION FOR <rol> … — hakkın kendisini alıcıda bırakır, yalnızca
devretme yetkisini düşürür; standartta CASCADE'in asıl kullanım yeri
budur. Rol üyelikleri de zincirin içindedir: devri kalkan bir üyelikle verilmiş alt üyelikler
dayanaksız kalır. Bir kullanıcı ya da rol düşürüldüğünde onun verdiği bağışlar da
gider; veren yok olduktan sonra o bağışı geri alabilecek kimse kalmazdı.
Hata REVOKE deyiminde değil COMMIT'te görünür: hak
satırları ertelenmiş işte yazılır (nesne kimlikleri ancak orada kesinleşir), dolayısıyla
dayanaksızlık denetimi de orada koşar. Düşen COMMIT işlemi de düşürdüğü için sonuç
aynıdır — yarım yazılmış bir hak tablosu ortada kalmaz.
| Kim | Neden |
|---|---|
| kimliği olmayan bağlantı | Motorun kendi iç bağlantıları; kimlik yoksa denetlenecek bir şey de yoktur. |
SYSDBA | Önyükleme login'i. Muafiyeti adından gelir, çünkü katalog daha kurulurken de geçerli olmak zorundadır. |
SYSTEM | Dahili kullanıcı (aşağıda). |
SYSADMIN üyeleri | Ek yönetici tanımlamanın yolu. |
| nesnenin sahibi | Sahip, nesneyi yaratan kullanıcıdır. |
Hepsi her veritabanında, sabit nesne kimliğiyle bulunur; adları
yeniden kullanılamaz (CREATE USER SYSDBA → duplicate USER
name).
| Kimlik | Ad | Ne |
|---|---|---|
| 80 | SYSTEM |
Dahili kullanıcı. SYS şemasının ve bütün
sys.* nesnelerinin sahibidir, denetimden muaftır ve onunla giriş
yapılamaz. Kataloğa yazan tek kimliktir. |
| 81 | SYSDBA | Önyükleme login'i; MASTER ilk kurulurken parolası masterkey olur, CONNECT parola ister (aşağıda). |
| 82 | GUEST | Hiçbir hakkı olmayan salt okunur kimlik; ajanın dil sunucusu yüzeyi bununla çalışır. |
| 200 | SYSADMIN | Ek yönetici. Üyeleri her denetimden muaftır. |
| 201 | DDLADMIN | Şekil hakları toplu: CREATE, ALTER, DROP, TRIGGER, REFERENCES. Veri haklarını taşımaz. |
| 202 | READ_ALL_DATA | Her ilişkide SELECT — sonradan yaratılanlar dâhil. |
| 203 | WRITE_ALL_DATA | Her ilişkide INSERT/UPDATE/DELETE. |
Sistem nesneleri (IVD$* katalog tabloları, yerleşik paketler, yerleşik alan
tipleri) herkese okunur: SELECT, EXECUTE ve
USAGE sorulmaz. Bu yerleşik bir kalıptır — PostgreSQL'de pg_catalog ve
information_schema, Firebird'de RDB$* da PUBLIC'e okunurdur. Aynı kural depoda da geçerlidir:
PostgreSQL ve Firebird veritabanında ivd$* tablolarında PUBLIC'in yalnız SELECT
hakkı vardır (PostgreSQL'de katalog şemasının USAGE hakkı da), yani IVEDI dışından bağlanan her
kullanıcı kataloğu okuyabilir, yazamaz. Hak katalog kurulurken verilir; eksikse ALTER DATABASE <db>
UPGRADE ve UPGRADE LEVEL tamamlar.
Buna karşılık katalog tablolarına doğrudan yazmak tümüyle kapalıdır:
SYSDBA ve SYSADMIN dâhil hiç kimse IVD$OBJECTS,
IVD$USER_MAP, IVD$OBJECT_PRIVILEGES gibi tablolara
INSERT/UPDATE/DELETE yapamaz; yazan tek şey motorun kendi
bakım yollarıdır ve onlar bunu dahili kimlik adına yapar. PostgreSQL'de de superuser
allow_system_table_mods açılmadan katalog tablosuna yazamaz.
IVD$ önekli her tablo katalog değildir. IVD$EVENT_LOG,
IVD$SCHEDULER_JOBS ve IVD$MESSAGE_QUEUE yerleşik paketlerin
uygulama tablolarıdır — kullanıcı kodunun onlara yazması beklenen davranıştır
(EventLog.write bunu yapar) ve sıradan tablo gibi davranırlar.
Bir görünümden okumak için çağırana görünümde SELECT yeter;
gövdesinin tabloları görünümün sahibi adına denetlenir (PostgreSQL'in ve
standardın definer modeli). Böylece bir tablonun yalnız bir kısmını gösteren görünüm, o
tabloya hiç hakkı olmayan kullanıcıya verilebilir — kullanıcı tabloya doğrudan eriştiğinde yine
reddedilir. Türetilmiş tablo ve CTE birer katalog nesnesi değildir; onların gövdesi çağıranın
kimliğiyle koşar.
Görünüm üzerinden yazmak da aynı modeldir: güncellenebilir bir görünüme INSERT /
UPDATE / DELETE / MERGE için hak görünümde
aranır, taban tablo görünümün sahibi adına denetlenir. Kolon düzeyi haklar görünümde de
geçerlidir: GRANT SELECT(a), UPDATE(b) ON v TO u yazan, tablodaki
merdivenin aynısını alır — görünüm düzeyinde hak yoksa okunan her görünüm kolonunda
SELECT, yazılan her görünüm kolonunda yazma hakkı gerekir; hiçbir kolon okumayan
count(*) herhangi bir kolondaki hakla geçer; DELETE kolon almaz.
INSERT ... RETURNING ile dönen görünüm kolonu da SELECT ister. Görünümün
kendi WHERE'inden gelen taban kolonları çağırandan sorulmaz; onlar sahibin
hakkıyla denetlenir.
RETURNING listesindeki bir ifadenin içindeki alan da SELECT
ister (returning c + 0, coalesce(c, 0), case when c ...);
UPDATE OR INSERT ... MATCHING (a) ise a'yı okur, yani a'da
SELECT gerekir.
PostgreSQL ya da Firebird üzerinde saklanan bir tablo/görünüm için verilen ya da alınan hak,
katalog satırı yazıldıktan sonra depolama motorunun kendi yetki sistemine de
uygulanır: GRANT SELECT, UPDATE (b) ON t TO u IVEDI'de kaydedilir
ve PostgreSQL'e GRANT SELECT, UPDATE (b) ON t TO u olarak gider. Böylece
aynı adlı motor rolü tabloya IVEDI dışından (psql, isql, başka bir uygulama) eriştiğinde aynı
hakları görür. Kurallar:
u PostgreSQL'de u, Firebird'de U).
PUBLIC PUBLIC'tir. Ad eşleşmesi dışında bir haritalama yoktur.SELECT/INSERT/UPDATE/DELETE/REFERENCES), tablo
ve kolon düzeyi; Firebird kolon listesini yalnızca UPDATE/REFERENCES
için bilir, kolon listeli SELECT/INSERT orada atlanır. Yordam, sıra ve
veritabanı hakları iletilmez. WITH GRANT OPTION ve REVOKE GRANT OPTION
FOR taşınır. PostgreSQL'de her GRANT alıcıya nesnenin şemasında USAGE
da verir; REVOKE şemaya dokunmaz.role "x" does not
exist) günlüğe WARNING düşer, IVEDI hak satırı kalır. IVEDI doğruluk kaynağıdır,
motor kopyası en iyi gayrettir. Bellek/EMR/sqlite/BlackHole motorlarında kullanıcı kavramı
olmadığı için hiçbir şey yapılmaz.Kimlik iki katmanlıdır: login MASTER'da yaşar, her veritabanı kendi
kullanıcı nesnesini taşır ve aynı login her veritabanında farklı adla bulunabilir. Hak denetimi bu
yüzden hedefin kendi veritabanındaki kullanıcıyla ve o kataloğun hak tablosundan
yapılır; birleştiren şey MASTER.SYS.IVD$USER_MAP'tir. Aynı kural
GRANT'in kendisi için de geçerlidir — alıcı, hedefin kataloğundaki kullanıcıdır — ve
başka bir veritabanındaki nesneye hak vermek üç parçalı adla yazılır:
grant select on xa.xs.t to kullanici;
Yerleşik kullanıcılar haritaya girmez: SYSTEM, SYSDBA
ve GUEST her katalogda aynı ad ve aynı kimlikle bulunduğu için eşleşmeleri bir kayıt
değil yapısal bir gerçektir. Harita yalnızca sıradan login'ler içindir.
CREATE USER <ad> [<yan tümce> …]
ALTER USER <ad> <yan tümce> [<yan tümce> …]| Yan tümce | Ne yapar |
|---|---|
IDENTIFIED BY '<parola>'PASSWORD '<parola>' |
Parolayı motor doğrular. İkisi eşanlamlıdır. |
IDENTIFIED EXTERNALLY |
Motor parola sormaz: doğrulamayı çağıran katman yapmıştır (Oracle'ın
IDENTIFIED EXTERNALLY'si, SQL Server'ın Windows login'i). |
ACCOUNT LOCK / ACCOUNT UNLOCK | İdari kilit. |
VALID UNTIL '<zaman>' / VALID UNTIL NULL |
Geçerlilik sonu; tarih geçince giriş reddedilir. PostgreSQL'in rol özniteliği. |
DEFAULT SEARCH_PATH = a, b, cDEFAULT SEARCH_PATH = NULL |
Kimlik kurulurken uygulanacak arama yolu. CONNECT bunu
uygulamaz — CONNECT yalnızca kimliği değiştirir. Var olmayan şema atlanır;
NULL ayarı kaldırır. |
PRIVILEGE CHECK STORAGE / PRIVILEGE CHECK ENGINE |
EXECUTION STORAGE kipindeki bir veritabanında bu kullanıcının yetkisini kimin denetlediği.
STORAGE (öndeğer): motor denetlemez, yetkiyi depo kendi kimliğiyle denetler. ENGINE:
motor da GRANT satırlarına göre denetler. IVEDI kipindeki veritabanlarında motor
her zaman denetler; sistem nesneleri, rol üyeliği ve veritabanına erişim (harita satırı) her iki seçenekte de
motordadır. |
FOR LOGIN <login> / FOR LOGIN NULL |
MASTER'daki login'i bu veritabanındaki kullanıcıya bağlar;
harita satırını yazmanın tek yoludur. SQL Server'ın CREATE USER … FOR LOGIN'i.
DROP USER kendi harita satırlarını da götürür. |
Parolasızlık bir yetki değildir. Giriş yapabilmek için ya bir parola ya da
açıkça IDENTIFIED EXTERNALLY gerekir; ikisi de yoksa o kullanıcı bir hesaptır ama
bir giriş değildir — harita hedefi olarak yaratılan kullanıcılar tam olarak bu
durumdadır.
Parola katalogda tuzlu özet olarak durur:
SHA256:<tuz>:<64 hex>, özetin girdisi <tuz> +
upper(<ad>) + ":" + <parola>. Tuz her parola atamasında yeniden üretilir, yani
aynı parolayı kullanan iki kullanıcının özeti farklıdır. Düz metin parola
saklanmaz ve üretilemez.
Çözülemeyen bir nesne adı derleme uyarısı verir ve o nesne için satır
yazılmaz; çözülemeyen bir alıcı hatadır. Firebird'ün
TO PROCEDURE <ad> biçimi (yordamın kendi haklarıyla koşması) bir kimlik değil bir
çalışma kipidir; bu modelde karşılığı olmadığı için uyarıyla atlanır.
SET ROLE yoktur; roller her zaman etkindir.