|
<< İç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 |
| Nesne | CREATE | ALTER | DROP |
|---|---|---|---|
DATABASE | var | var | var (CLOSE DATABASE depoyu silmeden ayırır; OPEN DATABASE var olan depoyu açar) |
DATABASE LINK | var | var | var |
SCHEMA | var | var — AUTHORIZATION <kullanıcı>, RENAME TO | var |
DOMAIN | var | var — SET DEFAULT, DROP DEFAULT, RENAME TO (Firebird yazımı TO <yeni> de geçerlidir), SET ATTRIBUTES (…) | var |
TABLE (ve GLOBAL/LOCAL TEMPORARY, EXTERNAL, VIRTUAL) | var | var — 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ılmaz | var |
VIEW | var (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 |
INDEX | var | var — ACTIVE, INACTIVE, RENAME TO, SET ATTRIBUTES (…) | var |
COLLATION | var | var — yalnız RENAME TO ve SET ATTRIBUTES (…); tanım değiştirilmez | var |
PACKAGE | var (CREATE OR ALTER yeniden tanım) | var — AS … (yeniden tanım), RENAME TO | var |
TYPE | var | var — ADD ATTRIBUTE, DROP ATTRIBUTE [RESTRICT], RENAME TO | var |
ENUM | var | var — ADD VALUE, RENAME VALUE … TO …, RENAME TO | var |
OPERATOR | var | var | var — imza zorunlu: DROP OPERATOR <op> (<tip>, …) |
PROCEDURE, FUNCTION, AGGREGATE FUNCTION, SQLMACRO, METACOMMAND | var | var — 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>, …) |
TRIGGER | var | var — ACTIVE, INACTIVE, POSITION <n>, RENAME TO, SET ATTRIBUTES (…) | var |
EXCEPTION | var | var | var |
SEQUENCE | var | var | var |
SYNONYM | var | var | var |
DIRECTORY | var | var | var |
CREDENTIAL | var | var — TYPE, SUB_TYPE, IDENTITY, PASSWORD, RENAME TO | var |
ROLE, USER | var | var | var |
EXTERNAL FUNCTION | var — yazımı DECLARE [EXTERNAL] FUNCTION | yok | var |
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.
| Yazım | Durum |
|---|---|
CREATE TABLESPACE | Adıyla reddedilir (“Unsupported CREATE object: tablespace”). |
CREATE TABLE … PARTITION BY | Sütun listesinden sonra tanınmaz (“token unknown”). |
CREATE MATERIALIZED VIEW | Adıyla reddedilir (“Unsupported CREATE object: materialized”). |
CREATE EXTERNAL FUNCTION | Yerine DECLARE [EXTERNAL] FUNCTION. |
CREATE FILTER, CAST, PROFILE, LIBRARY, CHARACTER SET, CLUSTER | Adıyla reddedilir (“Unsupported CREATE object: …”). |
CREATE GENERATOR | GENERATOR, 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 TABLE | GLOBAL ya da LOCAL zorunlu. |
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.
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ışı.