9.3 Depolama motorları

<< İçindekileri Görüntülemek İçin Tıklayın >>

Yer:  Teknik Kılavuzlar > IVEDI SQL Kullanıcı Kılavuzu > 9. Yerleşik kütüphane >

9.3 Depolama motorları

CREATE DATABASE … STORAGE ENGINE <ad> [PARAMETERS '<bağlantı dizgisi>']
AdNe içinTest süiti
MEMORYSüreç içi geçici satır deposu; MVCC, varsayılan yalıtım READ COMMITTED. Geliştirme ve test kiplerinde MASTER veritabanı bu motordadır.tamamı
SQLITESQLite (:memory: ya da dosya). Hizmetin MASTER veritabanı bu motorda sabit bir dosyadır (${APPDIR}/ivd$master.sqlite).tamamı
POSTGRESQLDış bir PostgreSQL veritabanı.tamamı
FIREBIRDDış bir Firebird veritabanı.tamamı
ODBCODBC üzerinden dış bir RDBMS.tamamı
EMRIVEDI'nin kendi sayfa tabanlı tek dosyalı deposu.koşulmuyor
BLACKHOLEHer şeyi atar; depolama olmadan DDL/derleme yolunu ve maliyetini ölçmek için. MASTER veritabanı bu motorda olamaz: yazılan katalog satırları geri okunamadığı için açılış betikleri ilk okumada boş katalog görür; INVALID_CONFIGURATION ile reddedilir. Kullanıcı veritabanı olarak kullanılabilir.yalnızca duman testi
IOTAd fabrikada tanınır ama hiçbir ürün derlemesinde etkin değildir.koşulmuyor
Not

ODBC ve POSTGRESQL derleme zamanında dış başlık ister (sql.h/sqlext.h, libpq-fe.h); derleme sistemi bunları dışarıda bırakabilir, o zaman ad da kabul edilmez. Çalışma zamanında istemci kitaplıkları dinamik yüklenir. PostgreSQL'e ayrıca veritabanı bağlantısı sürücüsü olarak da erişilebilir (CREATE DATABASE LINK … DRIVER POSTGRESQL); o ayrı bir yoldur.

9.3.1 Bağlantı dizgisi seçenekleri

PARAMETERS bağlantı dizgisi motorun kendi anahtarlarını (Server Name, User Name, Password, Database Name, CharSet, Port, Vendor Lib) taşır; IVEDI'ye özgü olanlar:

AnahtarMotorAnlam
Metadata Operations=OFFhepsiFiziksel DDL depoya gönderilmez; yalnız IVEDI kataloğu yazılır. Fiziksel şeması başka yoldan kurulmuş bir ürün veritabanına kataloğu yazmak içindir. CREATE DATABASE gibi OPEN DATABASE da bu seçeneği uygular. Seçenek yalnız açan oturum için geçerlidir: MASTER kaydına yazılmaz (kayıtta bulunursa ajan açılışta siler), sonraki açılışlar depo DDL'ini yine gönderir. Seçenek açıkken depoyu değiştirecek bir UPGRADE LEVEL reddedilir.
Catalog Schema=<ad>PostgreSQLHer bağlantıda şema yoksa yaratılır ve search_path <ad>, public olur: katalog tabloları (ivd$*) ve şemasız her nesne public yerine oraya gider.
Owner, Locale Provider, ICU Locale, LocalePostgreSQLCREATE DATABASE'e OWNER, LOCALE_PROVIDER (icu | libc | builtin), ICU_LOCALE, LOCALE (LC_COLLATE + LC_CTYPE) olarak eklenir; verilmeyen yazılmaz. Örnek: Owner=sysdba; Locale Provider=icu; ICU Locale=tr-TR; Locale=tr_TR.utf8.
OS Authentication=YesFirebird, PostgreSQL, ODBCAşağıda.
Session Authentication=YesFirebird, PostgreSQL, ODBCLogin'li oturumlar depoya kendi kullanıcı adı ve parolasıyla bağlanır; kayıttaki User Name/Password yalnız motorun kendi bağlantılarında kalır. Aşağıda.
Busy Timeout=<ms>sqliteDosya veritabanı WAL günlüğü ve normal kilit kipiyle açılır: birden çok süreç ve bağlantı aynı dosyayı kullanır, okuyucu yazıcıyı beklemez; yazıcı, başka bir yazıcının işlemi bitene kadar en çok bu kadar bekler, sonra database is locked alır. Öndeğer 30000. :memory: veritabanında etkisizdir (tek bağlantı, yalnız açan süreç).

9.3.2 İşletim sistemi oturumuyla kimlik doğrulama

PARAMETERS bağlantı dizgisindeki OS Authentication=Yes seçeneği "kullanıcı adı/parola gönderme, işletim sistemi oturumunun kimliğiyle bağlan" demektir. Bağlantı dizgisinde bir Password dursa bile yok sayılır, yani parolayı betikten ya da yapılandırmadan tamamen kaldırmaya yarar. Seçeneği yalnızca kimlik doğrulayan motorlar tanır:

MotorNe yapar
FIREBIRDDPB'ye isc_dpb_trusted_auth konur, kullanıcı adı/parola hiç gönderilmez; CREATE DATABASE yolunda USER/PASSWORD yan tümceleri yazılmaz. Sunucu tarafında Windows'ta Win_Sspi eklentisi devrede olmalıdır (firebird.conf → AuthServer) ve Windows kimliğini bir Firebird kullanıcısına bağlayan bir eşleme bulunmalıdır; yoksa bağlanma Missing security context ile döner.
POSTGRESQLlibpq bağlantı dizgisine password yazılmaz; kimlik doğrulama işletim sistemi oturumu üzerinden yürür (Windows'ta SSPI, POSIX'te GSSAPI/peer/ident). User Name verilmişse yine gönderilir; PostgreSQL doğrulanan işletim sistemi kimliğini istenen role pg_ident.conf ile eşler. Verilmemişse libpq oturumun kullanıcı adını kullanır.
ODBCBağlantı dizgisine Uid/Pwd yazılmaz ve Trusted_Connection=yes eklenir (DSN yolunda kullanıcı adı/parola boş uzunlukla geçilir). Bu anahtar sözcük sürücüye özgüdür: SQL Server sürücüsü tanır, tanımayan sürücü yok sayar. Başka bir anahtar gerekiyorsa Driver Options geçiş alanına yazılır.
Not

MEMORY, SQLITE, EMR, BLACKHOLE ve IOT motorlarında kimlik doğrulama yoktur; onlarda seçenek yok sayılır ve günlüğe bir uyarı yazılır (Storage engine SQLITE does not support 'OS Authentication', ignored).

9.3.3 Oturumun kimliğiyle depo bağlantısı (Session Authentication)

Öndeğerde motor bir veritabanının deposuna her oturum için MASTER kaydındaki User Name/Password ile bağlanır; IVEDI'nin kendi hakları (IVD$OBJECT_PRIVILEGES) bu tek depo kimliğinin üstünde uygulanır. Kayıttaki kimlik motorun servis kullanıcısıdır (aşağıda) ve depoda tam yetkilidir, yani IVEDI'nin hak denetiminden geçen her şey depoda tam yetkiyle koşar.

PARAMETERS bağlantı dizgisine Session Authentication=Yes yazılırsa login'li bir oturumun depo bağlantısı o login'in kimliğiyle kurulur:

  • Kullanıcı adı, login'in o veritabanındaki kullanıcısının adıdır (CREATE USER u FOR LOGIN l ile eşlenen u; eşleme yoksa login adı); depoya GRANT'ın yazdığı biçimde gider: PostgreSQL'de büyük harfli ad küçük harfe katlanır (SESSU → sessu), karışık harfli ad olduğu gibi; Firebird'de büyük harfli ad olduğu gibi.
  • Parola, oturumu açarken verilen login parolasıdır. Depoda aynı adlı ve aynı parolalı bir kullanıcı/rol bulunmalıdır; kullanıcıyı depoda kuran işletmecidir — motor depoya kullanıcı yaratmaz. Login'in parolası ALTER USER <login> PASSWORD '…' ile değiştirildiğinde motor, bu seçenekle kayıtlı her veritabanında eşlenen kullanıcı depoda varsa onun parolasını da kayıttaki kimlikle yazar; kullanıcısı depoda olmayan ya da yazılamayan veritabanı uyarı olarak bildirilir.
  • Depo kimliği oturumun başlangıç login'ininkidir: CONNECT IVEDI kimliğini değiştirir, açık depo bağlantısını değiştirmez.
  • Kayıttaki kimlik motorun kendi bağlantılarında kalır: kimliksiz iç bağlantılar (tembel katalog yükleme, zamanlayıcı işleri, yardımcı bağlantılar), önyükleme login'i SYSDBA ile açılan oturumlar ve dil sunucusu bağlantıları (GUEST, yalnız çevirir).
  • Depo kendi haklarını uygular: IVEDI'de SYSADMIN olan bir login bile depoda hakkı olmayan bir tabloyu okuyamaz (deponun hatası iletilir). Tablo ve görünüm hakları, yordamların EXECUTE'u ve dizilerin USAGE'ı için GRANT/REVOKE zaten depoya yansıtılır; PostgreSQL'de bir nesne hakkıyla birlikte nesnenin şemasının USAGE'ı da verilir (PostgreSQL'de şemaya ulaşmak ayrı bir haktır, IVEDI'de değildir). Katalog tabloları (IVD$*) depoda PUBLIC'e okunabilir; DDL yapacak kullanıcının depoda buna yetecek hakkı olmalıdır.
  • Her depo kimliği bağlantı havuzunda kendi anahtarını alır (parametrelerin özeti); aynı login'in oturumları bağlantıyı paylaşır, farklı login'ler paylaşmaz.
create database satis storage engine postgresql
  parameters 'Server Name=localhost; Database Name=satis; User Name=postgres; Password=***;
              Catalog Schema=netsim; Session Authentication=Yes';
Not

Seçeneği yalnız kimlik doğrulayan motorlar tanır (FIREBIRD, POSTGRESQL, ODBC); ötekilerde OS Authentication gibi uyarıyla yok sayılır. OS Authentication ile birlikte verilirse oturum kimliği kazanır: oturumun kullanıcı adı ve parolası gönderilir.

9.3.4 Motorun servis kullanıcısı (IVD$ENGINE)

Kayıttaki kimlik deponun süper kullanıcısı değildir. CREATE DATABASE / OPEN DATABASE'in PARAMETERS'ında verilen User Name/Password (SYSDBA, postgres) yalnız kurulum içindir: motor onunla bağlanıp depoda kendi servis kullanıcısını kurar (ajan ayarı engineUser, öndeğer IVD$ENGINE; PostgreSQL'de CREATE ROLE … LOGIN SUPERUSER, Firebird'de CREATE OR ALTER USER … GRANT ADMIN ROLE + GRANT CREATE DATABASE + hedef veritabanında GRANT DEFAULT RDB$ADMIN) ve parolasını rastgele üretir. Süper kullanıcının parolası hiçbir yere yazılmaz. Depo sunucusu başına bir servis kullanıcısı vardır (sunucu adı + port; Firebird'de Database Name'in sunucu:yol / sunucu/port:yol öneki ya da Server Name'deki sunucu/port da sunucu adıdır, öneksiz yol yerel sunucudur) ve kimliği MASTER'da o sunucunun credential'ında durur:

-- motorun kendi kurduğu nesne (MASTER, SYS şeması)
CREATE CREDENTIAL SYS.IVD$ENGINE_POSTGRESQL_LOCALHOST_5432 TYPE DBLINK
  IDENTITY 'ivd$engine' PASSWORD '…' TAGS (Engine = 'POSTGRESQL', Server = 'LOCALHOST', Port = '5432');

-- kayıt satırının parametreleri: kimlik yok, credential'a başvuru var
Server Name=localhost; Database Name=satis; Credential=SYS.IVD$ENGINE_POSTGRESQL_LOCALHOST_5432

Ajan kaydı açarken kullanıcı adını ve parolayı credential'dan alır. Aynı sunucunun ikinci kaydı aynı credential'ı kullanır; sunucunun son kaydı kapatılsa da credential kalır. ALTER DATABASE … SET PARAMETERS'ta maskesiz bir parola verilirse o kayıt credential'dan çıkar ve kendi mühürlü parolasını taşır. CREATE / ALTER CREDENTIAL … PASSWORD deyimlerinin parolası SQL izinde PASSWORD <password> olarak görünür. Kullanıcı adı depoya GRANT'ın yazdığı katlamayla gider (PostgreSQL'de ivd$engine, Firebird'de IVD$ENGINE). ODBC kaydı PostgreSQL lehçesinde olduğu için PostgreSQL'in rolünü kurar; aynı sunucudaki PostgreSQL ve ODBC kayıtları tek sunucu sayılır (port verilmemişse 5432) ve aynı rolü, aynı parolayla kullanır.

  • Kimlik doğrulamayan motorlarda (sqlite, bellek) ve OS Authentication=Yes kayıtlarda yapılmaz; User Name zaten servis kullanıcısıysa olduğu gibi alınır.
  • Kurulum başarısız olursa (verilen kimlik süper kullanıcı değil, bağlanılamadı) kayıt verilen kimliği taşır ve uyarı yazılır; ALTER DATABASE … SET ENGINE USER yineler.
  • Aynı depo sunucusunu paylaşan iki ajan farklı engineUser adı kullanmalıdır: ikisi aynı kullanıcının parolasını ezer, birinin bağlantıları düşer.

Var olan kaydı dönüştürmek:

set storage credentials user 'postgres' password '***';
set catalog satis;
alter database satis set engine user;                        -- parolayı motor üretir
alter database satis set engine user password 'Seçilen***'; -- ya da işletmeci belirler
commit;

PASSWORD verilirse servis kullanıcısının parolası o olur; verilmezse sunucunun credential'ındaki parola, o da yoksa rastgele bir parola kullanılır. Parola credential'a hemen yazılır (deyimin işleminden bağımsız: depodaki parola değişikliği geri alınmaz). Kayıt credential'a başvurur hâle gelir; aynı depo sunucusunda parolayı hâlâ satırında taşıyan servis kullanıcılı öteki kayıtlar da credential'a bağlanır; açık motorların bağlantıları yeni kimlikle yeniden açılır.

9.3.5 Bakım deponun süper kullanıcısıyla: SET STORAGE CREDENTIALS

ALTER DATABASE … UPGRADE, UPGRADE LEVEL, ADOPT LEVEL, DROP LEVEL ve ADOPT … LEVEL 3 Firebird / PostgreSQL / ODBC depolarında yedeği ve bütün yazımları ayrı bir bakım bağlantısında yapar (önce açık işlemi onaylar). Seviye 4'teki tek nesne benimsemesi (ADOPT TABLE …) bakım kimliği yoksa oturumun bağlantısında kalır. Bağlantının kimliği:

set storage credentials user 'SYSDBA' password '***';   -- oturumun depo süper kullanıcısı
alter database satis upgrade level 3 from 'server:C:\paket\satis_3.db';
set storage credentials none;                            -- siler
  • Oturumda SET STORAGE CREDENTIALS verilmişse o kimlik; yanlış parola yükseltmeyi hiçbir şey yazmadan reddeder (the storage credentials were refused).
  • Verilmemişse: SYSDBA oturumu ve kimliksiz bağlantılar kayıttaki (servis) kimliği kullanır; başka bir login yükseltmeyi başlatamaz (requires its superuser for maintenance).
  • Parola bağlantıda bellekte tutulur; üretilen metinde ve SQL izinde PASSWORD <password> olarak maskelenir (CONNECT gibi). Yalnız üst düzey deyimdir; yordam gövdesinde yazılamaz. Önizleme (PREVIEW) kimlik istemez.
  • Yönetim arayüzünün Yükseltme sayfası kimliği ilk çalıştırmada sorar ve her yükseltmeden önce bu deyimle verir, sonra siler.
Dikkat

Bu kılavuzdaki davranış ifadeleri MEMORY üzerinde ölçülmüştür. Test süiti beş motorda (bellek, sqlite, PostgreSQL, Firebird, ODBC) uçtan uca koşar, ama motorlar arasında bilinen davranış sapmaları vardır ve bunlar süitte ayrı ayrı sabitlenmiştir. EMR, BLACKHOLE ve IOT için ölçülmüş bir davranış garantisi yoktur.