6.1 Nesne türleri ve CREATE / ALTER / DROP

<< İç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.1 Nesne türleri ve CREATE / ALTER / DROP

NesneCREATEALTERDROP
DATABASEvarvarvar (CLOSE DATABASE depoyu silmeden ayırır; OPEN DATABASE var olan depoyu açar)
DATABASE LINKvarvarvar
SCHEMAvarvar — AUTHORIZATION <kullanıcı>, RENAME TOvar
DOMAINvarvar — SET DEFAULT, DROP DEFAULT, RENAME TO (Firebird yazımı TO <yeni> de geçerlidir), SET ATTRIBUTES (…)var
TABLE (ve GLOBAL/LOCAL TEMPORARY, EXTERNAL, VIRTUAL)varvar — ADD [COLUMN], ADD [CONSTRAINT …] …, DROP [COLUMN], DROP CONSTRAINT, ALTER [COLUMN] … {TO <yeni ad> | TYPE | SET DATA TYPE | SET DEFAULT | DROP DEFAULT | SET ATTRIBUTES (…)}, SET ATTRIBUTES (…); tablonun kendisi yeniden adlandırılmazvar
VIEWvar (CREATE OR ALTER / OR REPLACE yeniden tanım)var — AS … (yeniden tanım), RENAME TO, SET ATTRIBUTES (…), ALTER [COLUMN] … SET ATTRIBUTES (…) (görünüm sütunu; deyim başına bir sütun)var
INDEXvarvar — ACTIVE, INACTIVE, RENAME TO, SET ATTRIBUTES (…)var
COLLATIONvarvar — yalnız RENAME TO ve SET ATTRIBUTES (…); tanım değiştirilmezvar
PACKAGEvar (CREATE OR ALTER yeniden tanım)var — AS … (yeniden tanım), RENAME TOvar
TYPEvarvar — ADD ATTRIBUTE, DROP ATTRIBUTE [RESTRICT], RENAME TOvar
ENUMvarvar — ADD VALUE, RENAME VALUE … TO …, RENAME TOvar
OPERATORvarvarvar — imza zorunlu: DROP OPERATOR <op> (<tip>, …)
PROCEDURE, FUNCTION, AGGREGATE FUNCTION, SQLMACRO, METACOMMANDvarvar — CREATE OR ALTER / ALTER … AS yeniden tanım; PROCEDURE ve FUNCTION'da SET ATTRIBUTES (…) (yeniden tanım değil)var — birden çok aşırı yükleme varsa imza yazılır: DROP FUNCTION f(<tip>, …)
TRIGGERvarvar — ACTIVE, INACTIVE, POSITION <n>, RENAME TO, SET ATTRIBUTES (…)var
EXCEPTIONvarvarvar
SEQUENCEvarvarvar
SYNONYMvarvarvar
DIRECTORYvarvarvar
CREDENTIALvarvar — TYPE, SUB_TYPE, IDENTITY, PASSWORD, RENAME TOvar
ROLE, USERvarvarvar
EXTERNAL FUNCTIONvar — yazımı DECLARE [EXTERNAL] FUNCTIONyokvar
Not

ALTER EXTERNAL FUNCTION yoktur ve adıyla reddedilir; bir UDF'nin giriş noktasını değiştirmek için DROP EXTERNAL FUNCTION + DECLARE EXTERNAL FUNCTION yazılır. ALTER FUNCTION bir kümeleme fonksiyonunu sıradan fonksiyona (ya da tersine) çevirmez; tür eşleşmelidir.

6.1.1 Hiç tanınmayanlar

YazımDurum
CREATE TABLESPACEAdıyla reddedilir (“Unsupported CREATE object: tablespace”).
CREATE TABLE … PARTITION BYSütun listesinden sonra tanınmaz (“token unknown”).
CREATE MATERIALIZED VIEWAdıyla reddedilir (“Unsupported CREATE object: materialized”).
CREATE EXTERNAL FUNCTIONYerine DECLARE [EXTERNAL] FUNCTION.
CREATE FILTER, CAST, PROFILE, LIBRARY, CHARACTER SET, CLUSTERAdıyla reddedilir (“Unsupported CREATE object: …”).
CREATE GENERATORGENERATOR, SEQUENCE'in eş anlamlısıdır: CREATE SEQUENCE olarak çalışır.
RECREATE …Tanınmaz (“token unknown”); yerine CREATE OR REPLACE ya da DROP + CREATE.
CREATE TEMPORARY TABLEGLOBAL ya da LOCAL zorunlu.

6.1.2 Ortak değiştiriciler

CREATE OR REPLACE <nesne> …
CREATE OR ALTER   <nesne> …
CREATE <nesne> IF NOT EXISTS …
ALTER | DROP <nesne> IF EXISTS …
DROP <nesne> [, <nesne> …] [CASCADE | RESTRICT]

CREATE'de IF NOT EXISTS yazılır, NOT atlanamaz; ALTER ve DROP IF EXISTS alır. IF NOT EXISTS ile var olan bir ad bulunursa deyim kataloğa yazmaz, gövdesi yine de derlenir.

Kullanımdaki nesnenin düşürülmesi tanımsızdır. Açık bir imleç (bloğun statik SELECT'i, FOR SELECT döngüsü, açık CURSOR; imleç blok bitene kadar önbellekte kalır) ya da koşan bir yordam gövdesi bir nesneyi kullanırken o nesne DROP ile düşürülür ve COMMIT edilirse sonrası tanımsızdır: aynı blokta yeniden okumak ya da açık imleçten FETCH etmek süreci düşürebilir. Okuma ile düşürme ayrı bloklara konur. Derlenmiş bir deyimin hâlâ tuttuğu, ama düşürülmüş ya da yerini almış bir yordama giden çağrı OBJECT_DROPPED (SQLSTATE 55000) verir.

DROP … CASCADE (PostgreSQL modeli): RESTRICT (öndeğer) bağımlısı olan nesneyi COMMIT'te reddeder; CASCADE bağımlı görünüm, yordam/fonksiyon ve tetikleyicileri de düşürür - özyineli (görünüm zinciri) ve başka tablonun gövdesinde bu tabloyu okuyan tetikleyici dahil. Düşürülen nesnenin kendi çocukları (tetikleyicisi, indeksi, kısıtı) zaten onunla gider. Bağımlılık kaydı yordam ve görünümlerin yanında tetikleyici gövdeleri için de tutulur.

OR ALTER ve OR REPLACE var olan nesneyi yeniden tanımlar (ALTER VIEW … AS modeli: eski nesne derlemede sahibinden çıkar, yenisi kaydolur, COMMIT'te eskinin katalog satırları silinir). Yordam/işlevde "var olan" aynı imzalı yüklemedir: düz CREATE aynı imzada DUPLICATE_OBJECT verir, farklı imza aşırı yükleme olarak eklenir. Tetikleyicide aynı ad aynı ilişkide yeniden tanımdır, düz CREATE hatadır.

Yeniden tanımda nesne kimliği korunur: yeni nesne eskisinin object_id'sini devralır (PostgreSQL'in CREATE OR REPLACE'te OID'yi koruması gibi), dolayısıyla nesnenin yetkileri (IVD$OBJECT_PRIVILEGES), ona bağımlı nesnelerin kayıtları (IVD$OBJECT_DEPENDENCIES) ve öznitelikleri yerinde kalır — öznitelikte yeni bildirimdekiler kazanır, önceki tanımdan gelen ve bildirimde olmayanlar durur (SET ATTRIBUTES birleştirme anlamı). Alt nesneler (sütun, parametre, dönüş) yeniden kurulur; aynı adlı alt nesne eskisinin kimliğini ve özniteliklerini aynı kuralla devralır (görünüm sütununa ALTER VIEW … ALTER COLUMN … SET ATTRIBUTES ile yazılan öznitelik ALTER VIEW … AS sonrasında da durur). Bağımlılık kayıtları alan düzeyinin yanında nesne düzeyinde de tutulur (bir yordamın dönüş alanına bakan çağıran, yordamın kendisine de bağımlı yazılır).

Yeni tanım metninin yazmadığı özellikler eski nesneden gelir: nesnenin sahibi, açıklaması (COMMENT ON), SQL SECURITY (DEFINER / INVOKER yazılmadıysa) ve tetikleyicinin etkin / pasif durumu (ACTIVE / INACTIVE yazılmadıysa). Yeni metinde yazılan değer her zaman kazanır: CREATE OR ALTER TRIGGER … ACTIVE pasif tetikleyiciyi etkinleştirir, SQL SECURITY INVOKER yazılan yordam INVOKER olur.

Bağımlılar yeniden derlenir: yeniden tanım deyimi çalışırken katalogda nesneye bağlı kayıtlı yordam/işlev, görünüm ve tetikleyiciler kendi kaynak metinlerinden (IVD$SOURCE) yeniden tanım olarak (CREATE OR ALTER, görünümde ALTER VIEW … AS) yeniden derlenir; her biri kendi bağımlılarını sürdürür, döngü ve elmas kesilir. Yeniden derleme, nesnenin derleme anındaki arama yolunu kullanır — yol yaratılışta IVD$SEARCH_PATH özniteliğine yazılır — ve nesnenin kataloğunda koşar. Kaynak metni olmayan bağımlılar (sistem nesneleri, tablo kısıtları) atlanır. Bir bağımlı yeniden derlenemezse (imza değişti) yeniden tanım deyimi o hatayla düşer. Oracle'ın "bağımlı INVALID olur, yeniden derlenir" modelinin deyim anında (eager) hâli; PostgreSQL'de görünümler OID ile bağlı olup etkilenmez, PL/pgSQL işlevleri çalışma anında bağlanır.

Ad gölgeleme

Yeniden derleme adları o günkü arama yolu ve ad kurallarıyla yeniden çözer: arama yolunda daha önde bir şemaya sonradan aynı adlı bir nesne konduysa, yeniden derlenen bağımlı artık ona bağlanır (Oracle da gölgeleyen nesne yaratılınca bağımlıyı geçersiz kılar ve yeniden derlemede yeni çözüme gider). Bağlama değiştiğinde yeniden tanım uyarı verir: WARNING: PROCEDURE X now binds SHD_V to A.SHD_V (was B.SHD_V): a same-named object earlier in the search path — eski nesnenin katalogdaki bağımlılık kümesiyle yeni bildirimin başvuru listesi karşılaştırılır, aynı adlı ve aynı türde ama başka bir nesneye giden her ad için bir uyarı; SET WARNINGS OFF susturur. İki sınır vardır: aynı adlı iki işlev gölgelenmez, aşırı yükleme sayılıp "ambiguous call" verir (yeniden derleme o hatayla düşer); sqlite, Firebird ve ODBC depolarında farklı şemalarda aynı adlı iki tablo yaratılamaz, çünkü orada fiziksel ad veritabanı genelinde tekildir (bkz. Fiziksel ad ve şema). Gölgeleyen nesne yaratılınca bağımlılar geçersiz kılınmaz (Oracle modeli uygulanmaz).

DROP DATABASE <ad> adı çözer ve o veritabanını depoyla birlikte düşürür; CLOSE DATABASE <ad> depoyu silmeden sunucudan ayırır, OPEN DATABASE <ad> … (CREATE DATABASE seçenekleriyle) var olan bir depodaki kataloğu açar. CREATE DATABASE yalnız olmayan depoyu yaratır: dosya ya da veritabanı zaten varsa hata verir; yeniden yaratmak için önce DROP DATABASE, sonra CREATE DATABASE çalıştırılır. Kataloğu olmayan var olan bir depo OPEN DATABASE <ad> … CREATE CATALOG ile bağlanır: katalog tabloları deponun içine kurulur, ürünün tablolarına dokunulmaz; depoda bir sistem nesnesiyle (ivd$, emr$, iot$ …) aynı adı taşıyan tablo, görünüm, dizi ya da domain varsa katalog nesnesi onu ezer — verisiyle düşürülür, katalog tanımıyla yeniden kurulur ve ezilenler uyarıda adlandırılır. Veritabanı kaydedilir ve “yükseltme gerekiyor” durumunda kalır (ALTER DATABASE <ad> UPGRADE, ardından UPGRADE LEVEL 3 FROM / ADOPT LEVEL). CREATE CATALOG yazılmadan böyle bir depo açılırsa STORAGE_HAS_NO_CATALOG (SQLSTATE 55000) hatası döner; depoda zaten katalog varsa CREATE CATALOG bir uyarıyla yok sayılır. Geçerli veritabanı düşürülürse oturum ondan önceki veritabanına döner; SET CATALOG <veritabanı> geçerli kataloğu seçer (arama yoluna dokunmaz — bkz. SET SEARCH_PATH). Depo destekli (Firebird, PostgreSQL, sqlite dosyası, ODBC) bir veritabanına başka süreçler depo bağlantısı tutuyorsa DROP DATABASE ve CLOSE DATABASE önce o süreçlerden bağlantıyı bırakmalarını ister: yeni istek bekleyen (boştaki) işçi süreçler bağlantılarını hemen kapatır, komut en çok 10 saniye bekleyip yeniden sayar. O veritabanında açık bir oturumu ya da işlemi olan süreç bağlantısını bırakmaz; bu durumda komut reddedilir (the database is being accessed by other processes) ve önce o oturumların kapanması gerekir — PostgreSQL'in aynı durumdaki davranışı.