6.2 CREATE TABLE

<< İç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> [, …] )]

6.2.1 Sütun tanımı

<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
);

6.2.2 Tablo düzeyi kısıtlar

[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.

6.2.3 Tablo yan tümceleri

Yan tümceDurum
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 BYTanınmaz.
TABLESPACETanı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'
);

6.2.4 ATTRIBUTES — nesne öznitelikleri

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:

BildirimYan tümcenin yeri
CREATE TABLEsü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 DOMAINtipin (ve DEFAULT/NOT NULL/CHECK'in) ardından
CREATE INDEXanahtar listesinden sonra
CREATE VIEWsü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 / PROCEDUREparametre 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.

Koşullu öznitelik: FILTER, USING ve Metadata paketi

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.

Not

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.

6.2.5 Değişiklik kaydı: SET LOG LEVEL, SET LOG TRIGGERS, SET LOG LEVEL FROM ATTRIBUTES

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üzeyKaydedilen"ns.loglevel" karşılığı
NONEizlenmez; tetikleyiciler düşernolog
KEYyalnız anahtar kolonuprikeyonly
NOBLOBblob kolonları (ikili ve metin) dışında her kolonnoblob
NOBINARYikili blob dışında her kolon (metin blob girer)noblobclob
FULLher kolonfulllog
SYNCtetikleyici yok; aktarmada bütün tablo kopyalanırsynctable

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.

Log veritabanı: UPGRADE LEVEL ... AS LOG DATABASE

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).

  • Paketin her 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.
  • Özgün adla (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.
  • Nokta 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.
  • Yeni (damgasız) bir log veritabanı paketin seviye 3 damgasıyla işaretlenir. Yeniden koşu bir yükseltmedir: değişen kurulur, aynısı bırakılır.
  • Log veritabanında tablo olarak duran bir 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.

Kayıt aktarma: MOVE LOG

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).

  • INSERT yeni bir sürüm yazar (LOG$SCN_NO = kaydın SCN'i, bitişi açık, LOG$OPER = işlem).
  • UPDATE açık sürümün kopyasına değişen kolonları yazar ve önceki sürümün 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.
  • DELETE açık sürümü kapatır; yeni satır yazılmaz.
  • 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.
  • Log veritabanında 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.

Kayıt geçmişi: ChangeLog.History

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.