|
<< İç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.2 CREATE TABLE |
CREATE [OR REPLACE | OR ALTER]
[GLOBAL TEMPORARY | LOCAL TEMPORARY | EXTERNAL | VIRTUAL <tip>] TABLE [şema.]ad
( <sütun-veya-kısıt> [, …] )
[ON COMMIT {DELETE | PRESERVE} ROWS]
[ATTRIBUTES ( ad = <sabit> [, …] )]<ad> <tip>
[CHARACTER SET <cs>] [COLLATE <coll>]
[DEFAULT <ifade> | = <ifade>]
[GENERATED {ALWAYS | BY DEFAULT [ON NULL]} AS IDENTITY [ ( <dizi-öznitelikleri> ) ]]
[GENERATED ALWAYS AS ( <ifade> ) | COMPUTED BY ( <ifade> )]
[NOT NULL | NULL] [<satır içi kısıt> …]
[ATTRIBUTES ( ad = <sabit> [, …] )]Kimlik (identity) sütunu tablo başına bir tanedir, ölçeği sıfır olan bir tam sayı tipinde
olmalıdır, örtük olarak NOT NULL'dur ve arkasında
<tablo>$<sütun>$SEQ adlı bir dizi oluşturulur (Firebird'de 63 karakteri aşan ad
indekslerdeki gibi $<nesne-kimliği> ekiyle kırpılır).
Sütun düzeyinde (satır içi) PRIMARY KEY, UNIQUE,
CHECK ve REFERENCES yazılabilir; kurulan kısıt tablo düzeyindekiyle
aynı nesnedir ve çalışma zamanında gerçekten zorlanır.
CONSTRAINT <ad> ile adlandırılabilir. SQL:2011 11.7 gereği
PRIMARY KEY sütunlarına örtük NOT NULL konur (tablo düzeyi anahtarlarda
da). Hesaplanan sütun (GENERATED ALWAYS AS ( <ifade> ); Firebird yazımı
COMPUTED BY ( <ifade> ) aynı tanımdır) değerini satır yazılırken ifadeden alır ve
saklar; GENERATED BY DEFAULT AS ( <ifade> ) yazımı yoktur.
Satır içi yabancı anahtarın yazımı şudur; sütun listesi isteğe bağlıdır ve
yazılmazsa hedef tablonun birincil anahtarı alınır (SQL:2011 11.8). Hedefin birincil anahtarı yoksa
ya da bir ifade anahtarıysa liste zorunludur ve eksikliği adıyla bildirilir. Aynı sütunda
PRIMARY KEY / UNIQUE ile birlikte yazılabilir.
<sütun> <tip> [CONSTRAINT <ad>] REFERENCES <tablo> [ ( <sütunlar> ) ]
[ON UPDATE <eylem>] [ON DELETE <eylem>]create table t
(
id integer primary key, -- ortuk NOT NULL
code varchar(10) unique,
v integer constraint t_v_pos check (v > 0),
b integer generated always as (v + 1),
pid integer references t2, -- t2'nin birincil anahtarina
qid integer constraint t_qid_fk references t2 (id) on delete cascade
);[CONSTRAINT <ad>] PRIMARY KEY ( <ifade listesi> ) [<indeks>]
[CONSTRAINT <ad>] UNIQUE ( <ifade listesi> ) [<indeks>]
[CONSTRAINT <ad>] CHECK ( <mantıksal ifade> )
[CONSTRAINT <ad>] POLICY ( <mantıksal ifade> )
[CONSTRAINT <ad>] FOREIGN KEY ( <sütunlar> ) REFERENCES <tablo> ( <sütunlar> )
[ON UPDATE <eylem>] [ON DELETE <eylem>] [<indeks>]
<indeks> ::= USING [ASC | ASCENDING | DESC | DESCENDING] INDEX <indeks adı>Tablo düzeyi her kısıtın sonuna ATTRIBUTES ( ad = <sabit> [, …] ) yazılabilir;
satır içi kısıt bu yan tümceyi almaz — oradaki ATTRIBUTES sütunundur.
Bkz. ATTRIBUTES — nesne öznitelikleri.
USING [DESC] INDEX <ad> (Firebird yazımı) anahtar kısıtının depodaki indeksine ad ve yön verir;
satır içi PRIMARY KEY, UNIQUE ve REFERENCES'ın ardına da yazılır. Firebird'e ve
Firebird dönüştürmesine olduğu gibi gider. PostgreSQL ve sqlite'ta karşılığı yoktur: orada kısıtın indeksi kısıtın
adını taşır, yan tümce yalnız katalogda durur (EXPORT LEVEL ve UPGRADE LEVEL onu taşır).
ADOPT Firebird'te kısıtın indeksi kendi adından farklıysa ya da azalansa bu yan tümceyi geri yazar.
<eylem>: NO ACTION, SET NULL,
SET DEFAULT, CASCADE, RESTRICT. İki ON yan
tümcesi her biri en çok bir kez, sırası serbesttir. Sütun sayıları eşleşmek zorundadır.
REFERENCES'ın sütun listesi satır içinde de tablo düzeyinde de isteğe bağlıdır;
yazılmazsa hedef tablonun PRIMARY KEY'i kullanılır, hedefte PK yoksa
derleme hatasıdır.
Bir tabloda en çok bir PRIMARY KEY olabilir (SQL:2011 11.7);
ikincisi — satır içi ile tablo düzeyinin karışımı da dâhil — derleme hatasıdır ve mesaj var olan
kısıtın adını söyler. UNIQUE sayısı sınırsızdır.
Aynı sütun listesi ve aynı hedef için ikinci bir FOREIGN KEY
bildirmek — satır içi REFERENCES ile tablo düzeyi yazımın yan yana gelmesi de dâhil —
derleme uyarısı verir, hata değil: iki kısıt da kurulur ve ikisi de uygulanır,
yani sonuç yanlış değil gereksizdir. PRIMARY KEY'deki hatadan farkı şudur: orada üretilen şemayı
kalıcı motorlar kabul etmez, burada eder. Kısıta ad verilip aynı ad iki kez kullanılırsa bu
hatadır.
POLICY lehçeye özgüdür; satır düzeyi erişim koşulu tanımlar.
Kısıt sonradan da eklenebilir (SQL:2011 11.10):
ALTER TABLE <ad> ADD [CONSTRAINT <ad>] PRIMARY KEY | UNIQUE | CHECK | POLICY | FOREIGN KEY …
ALTER TABLE <ad> DROP CONSTRAINT <ad> [RESTRICT | CASCADE]Yazım yukarıdaki tablo düzeyi kısıtla aynıdır. Tablonun mevcut satırları yeni
kısıtı sağlamıyorsa deyim reddedilir; hata adı her depolama motorunda aynıdır:
UNIQUE_VIOLATION, PK sütununda NULL için NOT_NULL_VIOLATION,
FOREIGN_KEY_VIOLATION, CHECK için CHECK iletisi. Reddedilen deyim COMMIT'te yeniden
denenmez. Eklenen PRIMARY KEY'in sütunları NOT NULL olur. Kısıt deyim anında geçerlidir
ve ROLLBACK ile geri alınır; Firebird'de, diğer ALTER TABLE eylemleri gibi,
COMMIT'te uygulanır. Adsız kısıt IVD$PK_<kimlik> biçiminde bir ad alır.
DROP CONSTRAINT kısıtı deyim anında düşürür, ROLLBACK geri
getirir. Düşen PRIMARY KEY'in sütunları NOT NULL kalır. Bir PRIMARY KEY ya da
UNIQUE kısıtına dayanan (aynı tabloya ve aynı sütunlara başvuran) yabancı anahtar varsa
RESTRICT (öndeğer) deyimi reddeder; CASCADE o yabancı anahtarları da
düşürür.
| Yan tümce | Durum |
|---|---|
ON COMMIT {DELETE|PRESERVE} ROWS |
Yalnız geçici tablolarda yazılır; yazılmazsa DELETE ROWS geçerlidir. Kalıcı tabloda tanınmaz. |
ATTRIBUTES ( … ) |
Tablo, sütun ve tablo düzeyi kısıt düzeyinde; DOMAIN, VIEW (ve sütunu), INDEX, yordam
(ve parametresi) bildirimlerinde de var, ALTER … SET ATTRIBUTES ile sonradan
yazılır — bkz. ATTRIBUTES. Dış tablo dosya bilgileri buradadır. |
PARTITION BY | Tanınmaz. |
TABLESPACE | Tanınmaz. |
Tablo düzeyinde STORAGE ENGINE |
Yok — depolama motoru yalnızca CREATE DATABASE'te seçilir. |
AS <select> (CTAS), LIKE <tablo>, INHERITS, WITH (…) |
Yok. |
Dış tablo örneği — biçim bilgisinin tamamı ATTRIBUTES içinde verilir:
create external table EXTTABLE1
(
STOK_NO integer attributes (DataEncoding = 'text', DataSize = 11),
AKTIF char(1) attributes (Hidden = true, Selectable = false, DataSize = 1),
STOK_KODU varchar(24) attributes (DataSize = 24)
)
attributes
(
characterSet = 'ANSI', type = 'fixed', file = 'e:\dosya.txt', EndOfLine = c'\r\n'
);ATTRIBUTES ( ad = <sabit> [, …] ) bir katalog nesnesine tipli ad/değer çiftleri
iliştirir; çiftler SYS.IVD$OBJECT_ATTRIBUTES'a yazılır (ad büyük harfe çevrilir, değer
metin olarak, tipi IVD$TYPE'ta) ve OPEN DATABASE ile geri okunur. Motor
bunları yorumlamaz; uygulama katmanının metaverisini (ui.*, doc.* …) taşır.
Yan tümcenin yazılabildiği bildirimler:
| Bildirim | Yan tümcenin yeri |
|---|---|
CREATE TABLE | sütun listesinden sonra (tablo), sütun tanımının sonunda (sütun), tablo düzeyi kısıtın sonunda (kısıt) |
CREATE DOMAIN | tipin (ve DEFAULT/NOT NULL/CHECK'in) ardından |
CREATE INDEX | anahtar listesinden sonra |
CREATE VIEW | sütun takma adı listesinde her adın ardından (sütun) ve AS'ten önce (görünüm) — select'in sonuna konsaydı anahtar sözcük tablo takma adıyla karışırdı |
CREATE FUNCTION / PROCEDURE | parametre tanımının sonunda (parametre) ve RETURNS'ten sonra, AS'ten önce (yordam) |
ALTER DOMAIN <ad> SET ATTRIBUTES ( ad = <sabit> [, …] )
ALTER VIEW <ad> [RENAME TO <yeni>] SET ATTRIBUTES ( … )
ALTER INDEX <ad> SET ATTRIBUTES ( … )
ALTER TABLE <ad> SET ATTRIBUTES ( … )
ALTER TABLE <ad> ALTER [COLUMN] <sütun> SET ATTRIBUTES ( … )
ALTER PROCEDURE <ad> SET ATTRIBUTES ( … )
ALTER FUNCTION <ad> SET ATTRIBUTES ( … )
ALTER TRIGGER <ad> SET ATTRIBUTES ( … )
ALTER SCHEMA <şema> ALTER [COLUMN] NAME <kolon> SET ATTRIBUTES ( … )
COMMENT ON COLUMN NAME <şema>.<kolon> IS '…'SET ATTRIBUTES birleştirir: verilen adlar yazılır (var olan aynı ad
üzerine), verilmeyenler durur; bir özniteliği kaldıran biçim yoktur. DOMAIN/VIEW/INDEX'te öteki
ALTER yan tümceleri gibi COMMIT'te uygulanır; ALTER TABLE
deyim anında canlı tabloya uygulanır ve ROLLBACK eski çantayı geri kurar.
ALTER PROCEDURE | FUNCTION | TRIGGER … SET ATTRIBUTES yeniden tanım değildir:
yordamın kaynağı, derlenmiş gövdesi, yazım sayacı ve depodaki karşılığı aynı kalır, yalnız öznitelik satırları
yazılır; seviye yükseltmesi bu öznitelikleri (ve COMMENT ON açıklamasını) yordamı yeniden kurmadan
taşır. Ad tek bir nesneyi göstermelidir: aşırı yüklü bir ad reddedilir, ALTER PROCEDURE bir işlevi
bulmaz. Tetikleyici adla nitelenemez, arama yolundaki şemada aranır. Yordamın öteki ALTER'ları yeniden
tanımdır. PostgreSQL çevriminde CREATE'teki öznitelikler üretilmez, ALTER … SET ATTRIBUTES
hedef metin üretmez (IVEDI'ye özel).
Ad kuralı: ALTER SCHEMA … ALTER COLUMN NAME ve COMMENT ON COLUMN NAME, o
şemadaki bu adı taşıyan bütün tablo ve görünüm kolonlarına öznitelik ve açıklama verir (her tabloda
bulunan sistem alanları için tek tanım). Kural IVD$COLUMN_RULES tablosunda saklanır
(IVD$V_COLUMN_RULES görünümü); = NULL ya da
IS '' kaldırır, FOR LOCALE kabul edilmez. Bir kolonun etkin değeri şu sırayla
aranır: kolonun kendi değeri > görünüm kolonuysa kaynak kolonun etkin değeri (kaynağın kendisi, onun kaynağı, kaynağın
adıyla ad kuralı, kaynağın domain'i) > kolonun kendi adıyla ad kuralı > domain.
Sık kullanılan öznitelikler (ui.*, lookup.*, enum.values,
dx.*, web.*, doc.*, ns.*, sec.class) satır olarak değil
IVD$OBJECT_PROPS tablosunun kolonları olarak saklanır; FILTER'lı değer kendi koşulunun satırındadır.
Sözdizimi ve okuma aynıdır; IVD$V_ATTRIBUTES bunları da satır olarak gösterir. Kısa öznitelik değerleri en çok
255 karakterdir (aşan değer reddedilir); açıklama niteliğindeki uzun öznitelikler sınırsızdır. Görünüm kolonunun kaynağı (kaynak kolon ve SELECT'teki takma adı) görünüm her kaydedildiğinde
katalogda tutulur; ifade kolonunun kaynağı yoktur. Sınama modülü: sqltest/ddl/test29-attributes.sql.
Tırnaksız ad büyük harfe çevrilir (ui_caption → UI_CAPTION); noktalı sözlük adları
tırnakla olduğu gibi kalır ("ui.caption"). İki ad çantaya girmez, sabit slota gider:
"ns.guid" = '{…}' ve kısa yazımı GUID = '{…}' nesnenin
ivd$objects.ivd$guid_object_id kolonuna yazılır, öznitelik satırı olarak tekrarlanmaz; bkz.
Sürüm sayacı ve GUID, veritabanı kimlik kartı, depo lehçesinde ifade (NATIVE_SQL), seviye sınırı ve damgalar, seviye paketleri, benimseme ve UPGRADE TABLE, yedek alma (BACKUP TO), yedekten kurma (RESTORE DATABASE), IVD$V_* sistem görünümleri.
Bir öznitelik satırı bir koşul taşıyabilir:
ATTRIBUTES ("ui.caption" = 'Cari', "ui.caption" = 'Müşteri' FILTER (MODULE = 'M1'), "ui.caption" =
'Web Müşteri' FILTER (MODULE = 'M1' AND UI_FORM = 'WebForm1')). Aynı ad birden çok satırda olabilir; koşulsuz
satır taban değerdir. Koşul metni IVD$OBJECT_ATTRIBUTES.IVD$FILTER kolonuna olduğu gibi yazılır
(ad indeksi tekil değildir), SET ATTRIBUTES aynı ad + aynı koşul metnini değiştirir, farklı koşul
yeni satır ekler; OPEN DATABASE geri okur. Koşul bildirimde derlenmez: tanımlayıcıları okuma anındaki
parametrelerdir, sözdizimi hatası ilk okumada çıkar.
Okuyucu Metadata paketidir (bkz. Metadata paketi):
Metadata.Attribute(<nesne>, <ad>) USING (MODULE = 'M1', UI_FORM = 'WebForm1') etkin değeri
(skaler) döndürür; AttributeInfo, Attributes, AllAttributes ve
EffectiveAttribute aynı çözümü sonuç kümesi olarak verir. Nesne adı noktalı olabilir
(SEMA.TABLO, TABLO.KOLON) ve arama yolunda çözülür. Seçim CSS özgüllüğüdür: eşleşen koşullar arasında koşulda geçen parametre
sayısı fazla olan kazanır, eşitlikte sonraki bildirim; hiçbiri eşleşmezse taban. USING'de verilmeyen
parametre NULL'dur (üç değerli mantık: UI_FORM = 'x' eşleşmez, UI_FORM IS NULL eşleşir),
karşılıksız parametre yok sayılır. Koşul motorun kendi boolean ifadesidir (=, IN,
LIKE, AND/OR/NOT, IS NULL …) ve her okumada motorun derleyicisiyle koşulur
(önbellek yoktur).
f(args) USING (AD = değer, …) yan tümcesi genel bir çağrı biçimidir, ama yalnız
ALLOW USING diktesiyle bildirilen metotta geçerlidir (ALLOW NULLS gibi
parametre listesinin başında: CREATE FUNCTION f (ALLOW USING p1 integer, PARAMS ctx ARRAY OF VARIANT);
son parametre açık liste olmak zorundadır, yoksa bildirim reddedilir). Çiftler ('AD', değer) olarak o
listeye eklenir; ALLOW USING olmayan metotta USING hata. Görünen etiket, düzenleme deposu ve değer eşlemesi için sabit slot kolonu yoktur:
bu değerler yalnız "ui.caption", "dx.repo", "enum.values" öznitelikleridir.
Sınama modülü:
sqltest/ddl/test34-attribute_filter.sql.
VIRTUAL <tip> TABLE yazımında kabul edilen tek <tip>
DUAL'dır. Sanal tablolar (DUAL, dış tablolar) IVEDI_ONLY'dir: depoda
karşılıkları yoktur, depoya inen bir görünüm ya da yordam onlara başvuramaz (orada tek satırlık bir tablo
gerekiyorsa ivd$database kullanılır). Çeviride tek FROM öğesi DUAL ise
PostgreSQL metninde FROM yazılmaz, Firebird metninde FROM RDB$DATABASE yazılır.
Bir tablonun satır değişikliklerini motor kaydedebilir. Hangi tablonun hangi ayrıntıyla izleneceği
SYS.IVD$LOG_SETUP'ta durur, yakalanan satırlar SYS.IVD$LOG_DATA'da birikir (SCN sırası
SYS.IVD$LOG_SCN_NO dizisinden). Nesneler adla değil katalog kimliğiyle anılır: tablo
IVD$TABLE_ID, anahtar IVD$KEY_COLUMN_ID, blob'daki alan kimliği kolonun IVD$OBJECTS
kimliğidir; adlar IVD$OBJECTS'ten okunur.
Yakalamayı motorun ürettiği tetikleyiciler yapar: <tablo>$LG_AI,
$LG_AU, $LG_AD (AFTER INSERT / UPDATE / DELETE, POSITION 0). Bunlar katalog nesnesidir ve
IVD$LOG_GENERATED özniteliğini taşır: seviye yükseltmesi onları korur ve tablo değişince yeniden
üretir, EXPORT LEVEL paketlemez (hedef kendi ayarından üretir).
ALTER TABLE <ad> SET LOG LEVEL { NONE | KEY | NOBLOB | NOBINARY | FULL | SYNC }
ALTER TABLE <ad> SET LOG TRIGGERS { ACTIVE | INACTIVE }
ALTER DATABASE <ad> SET LOG LEVEL FROM ATTRIBUTES| Düzey | Kaydedilen | "ns.loglevel" karşılığı |
|---|---|---|
NONE | izlenmez; tetikleyiciler düşer | nolog |
KEY | yalnız anahtar kolonu | prikeyonly |
NOBLOB | blob kolonları (ikili ve metin) dışında her kolon | noblob |
NOBINARY | ikili blob dışında her kolon (metin blob girer) | noblobclob |
FULL | her kolon | fulllog |
SYNC | tetikleyici yok; aktarmada bütün tablo kopyalanır | synctable |
Kaydı yalnız güvenlikli sistemin NS_ tablolarının tutulur: NS_ önekli olmayan
bir tabloya KEY, NOBLOB, NOBINARY ya da FULL verilmesi hata verir
(NONE ve SYNC her tabloda çalışır).
Anahtar tablonun PRIMARY KEY'idir ve tek kolonlu bir tamsayı olmalıdır
(SMALLINT, INTEGER, BIGINT); değeri IVD$KEY_VALUE'ya yazılır. PRIMARY KEY'i
olmayan, bileşik ya da tamsayı olmayan tablonun kaydı tutulamaz: NONE dışındaki her düzey hata verir,
NONE her tabloda çalışır. Seviye yükseltmesinden sonra kurala artık uymayan bir tablonun tetikleyicileri
düşer ve rapor ERROR satırı yazar.
Her satır işlemi (I/U/D), zamanı, hareketi, oturumu
(IVD$SESSION_ID) ve modeli (IVD$MODEL_ID) taşır; kullanıcı oturumdan çözülür.
UPDATE yalnız değişen kolonları kaydeder. Veri biçimi IVD$FORMAT'tadır: F
Firebird'de UDF blob'u (LogStart / LogField / LogFieldBlob / LogEnd, NSDBUtils; alan başına 4 bayt
kolon kimliği (katalog kimliği) + 1 bayt tip + değer). Oturum ve model NSDBUtils'in
GetSessionId() / GetModelId() işlevlerinden okunur; uygulama bunları
SetSessionId(<oturum>) / SetModelId(<model>) ile verir. Atanmamış değer 0'dır,
model 0 "modelsiz" demektir; ikisi de NULL almaz (sonuç -4). Oturum numarası kullanıcı bilgisi tamamlandıktan sonra
değiştirilemez (sonuç -2): kayda başka bir oturum yazdırılamaz.
Tetikleyici bu UDF'leri bildirim adlarıyla çağırır; hepsi veritabanında DECLARE EXTERNAL FUNCTION ile
bildirilmiş olmalıdır, bildirilmemişse tetikleyici kurulamaz ve SET LOG LEVEL derleme hatası verir.
PostgreSQL deposunda veri biçimi J'dir: IVD$DATA,
{"<kolon kimliği>": değer, …} JSON'unun UTF-8 baytlarını taşır. INSERT dolu kolonları, UPDATE yalnız
değişen kolonları yazar; NULL'a dönen kolon null olarak görünür, değişmeyen kolon hiç yer almaz. İkili blob
base64 metni, öteki tipler JSON karşılığıyla (metin blob metin, tarih ISO metni) yazılır. PostgreSQL'de
LogStart / LogField / LogFieldBlob / LogEnd gerekmez; yalnız GetSessionId /
GetModelId kullanılır. Firebird ve PostgreSQL dışındaki depolarda düzey yazılır, tetikleyici üretilmez
(uyarı).
SET LOG LEVEL FROM ATTRIBUTES seviye 3/4 tablolarının "ns.loglevel" özniteliğini okuyup
her birine yukarıdaki karşılığı uygular; özniteliği olmayan tabloya dokunmaz, anahtar kuralına uymayan tabloyu uyarıyla
atlar. SET LOG TRIGGERS INACTIVE
tetikleyicileri katalogda ve depoda kapatır, ayar satırı durur. SET LOG üst düzey bir deyimdir, deyimin
tek öğesidir ve tabloda ALTER hakkı ister; katalog satırı ve tetikleyiciler deyim anında kurulur,
COMMIT kalıcı kılar. Tetikleyiciler SQL SECURITY DEFINER ile üretilir: IVD$LOG_DATA'ya
yazma hakkı tetikleyicinin sahibinindir, kullanıcıya ya da PUBLIC'e hak verilmez. Çevrim üreticileri deyimi yorum
olarak yazar (IVEDI'ye özel).
Seviye yükseltmesinde depoda duran, katalogda olmayan eski <tablo>_LG_AI/AU/AD tetikleyicileri
öteki depo-yalnız tetikleyiciler gibi düşer ve rapor WARNING satırıyla
SET LOG LEVEL FROM ATTRIBUTES yolunu gösterir.
ALTER DATABASE <log> UPGRADE LEVEL 3 FROM '<paket>' AS LOG DATABASE FOR <ana>
[KEEP (<tablo>, …)] [SKIP (<nesne>, …)] [PREVIEW | CONFIRMED]Ana veritabanının seviye 3 paketini, kaydı tutulan tabloların bütün sürümlerini saklayan bir log
veritabanı olarak kurar ya da yükseltir. Log veritabanı ana veritabanıyla aynı depo motorunda olur ve
MASTER'da kayıtlıdır; kartında IVD$LOG_SOURCE ana kaydın adını taşır ve aynı ad MASTER'daki kayıt
satırının LOG SOURCE niteliğine yazılır (komut, OPEN DATABASE ve katalog UPGRADE'i yazar); hizmet
bir ana veritabanının log veritabanını buradan bulur. Seviye 4 paketi
(UPGRADE LEVEL 4 ... AS LOG DATABASE FOR <ana>) ancak aynı ana kaydın seviye 3 log veritabanına
uygulanır.
Log veritabanı yalnız güvenlikli sistem için kurulur: ana veritabanının kartı SECURITY ON
olmalı ve paket güvenlik bayrağını taşımalıdır, yoksa komut reddedilir. Ana veritabanının
SYS.IVD$LOG_SETUP'ında NS_ önekli olmayan bir tablonun düzeyi KEY,
NOBLOB, NOBINARY ya da FULL ise komut tabloları sayarak reddedilir (ürün
hatası; düzeyleri NONE yapılmalıdır).
NS_X tablosu, SYS.IVD$LOG_SETUP'taki düzeyine bakılmadan log veritabanında
LG_X olur. Anahtarı tek kolonlu bir tamsayı PRIMARY KEY olmayan bir NS_ tablosu ürün
hatasıdır: kurulum tablonun adıyla durur. LG_X'in kolonları düz tipleriyle, ek olarak LOG$SCN_NO
(sürümün başladığı SCN), LOG$SCN_END (bittiği SCN) ve LOG$OPER (sürümü yazan işlem
I/U); sürümün zamanı, oturumu ve modeli için ayrı kolon yoktur - satır tablonun kendi
CTIMESTAMP / SESSION_ID / MODEL_ID kolonlarıyla gelir; birincil anahtar
(anahtar, LOG$SCN_NO); tekil kısıt ve indeksler düz indeks; yabancı anahtar, CHECK ve tablo
tetikleyicileri kurulmaz. İndeks ve kısıt adları LG_ önekini alır.NS_X) bir zaman noktası görünümü
kurulur: LOG$SCN_NO <= nokta < LOG$SCN_END olan sürümü, özgün kolonlarla ve
LOG$ kolonlarıyla verir; üzerinde boş bir NS_X_LOG_IUD tetikleyicisi durur. Paketin
görünüm (ürünün X görünümü dahil) ve yordamları bu görünüm üzerinden çalışır.SYS.IVD$LOG_POINT'in tek satırıdır (IVD$POINT_NO = 1,
IVD$SCN_NO); satır yoksa görünüm en son sürümü gösterir.NS_ önekli olmayan tablolar olduğu gibi kurulur. KEEP ve "ns.log.keep" = 'Y'
NS_ tablosuna uygulanmaz. "ns.log.skip" = 'Y' taşıyan ya da SKIP'te yazılan
nesneler log veritabanında hiç kurulmaz.LG_ tablolarına tohum veri yazılmaz; paketin yükseltme komutları (ivd$upgrade) log
veritabanında çalışmaz.NS_X tablosunun açıklaması, hakları, yerelleştirmesi ve öznitelikleri NS_X görünümüne
geçer; log veritabanının okuyucuları NS_X'i (ya da ürünün X görünümünü) okur.NS_X LG_X'e dönerken satırları
LG_X'e LOG$SCN_NO = 0 ile ilk sürüm olarak taşınır (onay istenmez). Bir LG_X
düşüp yerine NS_X tablosu kurulacaksa geçerli sürümleri yeni tabloya kopyalanır ve geçmiş kaybolduğu
için deyim ancak CONFIRMED ile uygulanır.ALTER DATABASE <ana> MOVE LOG TO <log> [ROWS <n>] [SYNC TABLES]Ana veritabanının SYS.IVD$LOG_DATA satırlarını SCN sırasıyla log veritabanının LG_X
tablolarına sürüm olarak yazar ve ana veritabanında siler. Deyim ana veritabanı geçerli katalogken
yazılır; log veritabanı o ana kaydın log veritabanı olmalı (kartında IVD$LOG_SOURCE) ve iki veritabanının
seviye 3 damgası eşit olmalıdır. Her iki biçim çözülür: Firebird'ün UDF blob'u (F; sayısal ölçek kolonun
tipinden okunur) ve PostgreSQL'in JSON'u (J).
LOG$SCN_NO = kaydın SCN'i, bitişi açık,
LOG$OPER = işlem).LOG$SCN_END'ini
bu SCN ile kapatır. Aynı hareketteki aynı anahtarın ardışık UPDATE'leri tek sürümde birleşir. Önceki sürümü
olmayan UPDATE uyarıyla atlanır.ROWS n bir koşuda en çok n satır aktarır. Yarıda kalan bir koşu tekrarlanabilir: o SCN'in sürümü
zaten varsa yeniden yazılmaz.LG_X'i olmayan tablonun satırları ana veritabanında kalır ve uyarılır (log
veritabanı UPGRADE LEVEL ... AS LOG DATABASE ile yenilenmelidir).SYNC TABLES: ana veritabanında düzeyi SYNC olan tablolar log veritabanında bütünüyle
yenilenir.Sonuç, yükseltme raporu gibi satır satır döner: tablo başına aktarılan ve kalan satır sayısı, uyarılar ve özet. Düzenli aktarma için deyim zamanlayıcıya görev olarak verilebilir.
select * from ChangeLog.History('STOKENDO', 12345)
select * from ChangeLog.History('NETSIM.STOKENDO', 12345)Log veritabanında bir kaydın bütün sürümlerini eskiden yeniye verir; yalnız SELECT içinde çalışır
(Metadata okuyucuları gibi). İlk parametre tablonun özgün adı (görünüm) ya da LG_ tablosu, ikincisi
tablonun tek kolonlu tamsayı anahtarının değeridir. Kolonlar: SCN_NO ve SCN_END (sürümün
geçerlilik aralığı; güncel sürümde SCN_END = 9223372036854775807), OPERATION (sürümü yazan işlem
I/U), CHANGED_COLUMNS (önceki sürüme göre değeri değişen kolonlar, virgülle; ilk
sürümde boş) ve ROW_DATA (sürüm, kolon adı → değer JSON nesnesi; tablonun kendi CTIMESTAMP /
SESSION_ID / MODEL_ID kolonları da içinde; tarihler ISO, ikili veriler base64, LOG$
kolonları yok). Silinmiş bir kaydın son sürümünün SCN_END'i silen kaydın SCN'idir ve ardılı yoktur.