602SQL-Úplná dokumentace Index  

Příkaz ALTER TABLE

Příkaz ALTER TABLE mění strukturu a vlastnosti databázové tabulky. Jeho syntaxe a funkce závisí na nastavení příznaků kompatibility. Syntaxe odpovídající normě SQL vypadá takto:

příkaz_ALTER_TABLE ::= ALTER TABLE [schéma.]jméno_tabulky [ příznak_tabulky ... ] akce {, akce }...
příznak_tabulky ::= NO_JOURNAL | REC_PRIVILS | ZCR | UNIKEY | LUO | TOKEN | DETECT 
akce ::= přidání_sloupce | odstranění_sloupce | změna_sloupce | přidání_omezení_tabulky 
	| odstranění_omezení_tabulky
přidání_sloupce ::= ADD [ COLUMN ] popis_sloupce
odstranění_sloupce ::= DROP [ COLUMN ] jméno_sloupce
změna_sloupce ::= ALTER [ COLUMN ] jméno_sloupce { popis_sloupce | SET DEFAULT implic_hodnota | DROP DEFAULT }
přidání_omezení_tabulky ::= ADD popis_omezení
odstranění_omezení_tabulky ::= DROP CONSTRAINT jméno_omezení
popis_omezení ::= [CONSTRAINT jméno_omezení] { popis_indexu | vnitřní_integritní_omezení
	| referenční_integritní_omezení }

Syntaxe kompatibilní se staršími verzemi 602SQL se liší v těchto detailech:

akce ::= přidání_sloupce | změna_sloupce | odstranění_sloupce | popis_omezení
přidání_sloupce ::= ADD [ pořadí ] popis_sloupce [ VALUES " výraz_pro_přenos_hodnoty " ]
změna_sloupce ::= ALTER [ COLUMN ] jméno_sloupce { popis_sloupce [ VALUES " výraz_pro_přenos_hodnoty " ] 
    | SET DEFAULT implic_hodnota | DROP DEFAULT }

V obou variantách syntaxe se uvádějí přidávané, měněné a rušené sloupce (viz popis sloupce). Syntaxe 602SQL dovoluje navíc specifikovat pořadí - pořadové číslo nového sloupce v návrhu tabulky (počítáno od 1). Dále umožňuje uvést výraz definující hodnotu nového nebo měněného sloupce pomocí hodnot starých sloupců, a tím zajistit transformaci dat uložených v modifikované tabulce.

V syntaxi SQL se dále uvádějí přidávaná a rušená omezení (viz popis indexu a popis integritních omezení), zatímco v syntaxi 602SQL se uvedou všechna omezení, které mají platit v nové tabulce, ostatní omezení budou automaticky zrušena. Má-li tabulka příznaky_tabulky specifické pro 602SQL, musí se v syntaxi SQL uvést znovu (nejde je odstranit), pro syntax 602SQL platí: jsou-li uvedeny, zůstanou beze změny, nejsou-li uvedeny, odstraní se.

Příznaky kompatibility se nastavují buď globálně z dialogu Provozní parametry na záložce SQL kompatibilita serveru nebo dynamicky pomocí funkce Set_sql_option, volba SQLOPT_OLD_ALTER_TABLE (128). Pro fungování příkazu je rozhodující nastavení příznaku kompatibility v okamžiku překladu. Proto pokud v proceduře následují po sobě příkaz měnící příznak kompatibility a příkaz ALTER TABLE, pak se efekt změny příznaku nemůže na provádění ALTER TABLE projevit.

Modifikace tabulky pomocí návrháře tabulek nastaví příznak kompatibility na syntaxi 602SQL.

Příkaz nelze použít na dočasnou tabulku.

Přidání nebo odstranění indexu provádějí také příkazy CREATE INDEX a DROP INDEX.

Pravidla pro používání příkazu ALTER TABLE

Odkazy na tabulku z jiných objektů

Změna struktury tabulky může zasáhnout řadu objektů, které na ní odkazují. Uložené procedury, formuláře, aplikační programy atd. odkazující na zrušené nebo změněné sloupce tabulky mohou přestat fungovat.

602SQL nezruší odkazující objekty při provedení ALTER TABLE ani nebrání provedení ALTER TABLE v případě, že odkazující objekty existují. Místo toho očekává, že autor aplikace uvede odkazující objekty do souladu s novou strukturou tabulky.

Odkazy na tabulku z následujících SQL příkazů

Příkazy jazyka SQL jsou před svým prováděním analyzovány, optimalizovány a překládány do tvaru, který umožní jejich efektivní provedení. Tato fáze využívá informace o struktuře použitých tabulek. Pokud se mezi překladem SQL příkazu a jeho provedením struktura tabulek změní, příkazy by se provedly nesprávně.

Tato situace nastane v případě, kdy je příkaz ALTER TABLE zařazen do posloupnosti příkazů v proceduře nebo triggeru, v níž se po jeho provedení jakýmkoliv způsobem manipuluje se stejnou tabulkou. Proto po provedení ALTER TABLE není dovoleno jakkoli pracovat s daty v této tabulce až do úplného dokončení všech rozpracovaných uložených procedur a triggerů.

Příklady nepovolených operací:

  1. Použití tabulky TB v jakémkoli SQL příkazu následujícím po ALTER TABLE TB.
  2. Použití dotazu odkazujícího na tabulku TB v jakémkoli SQL příkazu následujícím po ALTER TABLE TB.
  3. Výskyt příkazu z bodů 1 nebo 2 v proceduře zavolané pro provedení ALTER TABLE.
  4. Výskyt příkazu z bodů 1 nebo 2 v triggeru aktivovaném pro provedení ALTER TABLE.
  5. Výskyt příkazu z bodů 1 nebo 2 v proceduře, do níž se řízení vrátí z procedury, která provedla ALTER TABLE.

Je-li nezbytné, aby se takové příkazy vyskytly v jedné proceduře, je nutno odložit kompilaci příkazů závislých na nové struktuře tabulky pomocí funkce SQL_execute.

Klientské prostředí po změně tabulky

Dojde-li ke změně struktury tabulky pomocí návrháře tabulek, klientské prostředí pozmění všechny své potřebné datové struktury na nový tvar tabulky, takže je možné okamžitě začít s tabulkou pracovat. Jinak tomu je, pokud se z klientského prostředí zavolá procedura, která provede ALTER TABLE - běžící klient se nedozví o změně struktury a s tabulkou nepůjde plnohodnotně pracovat až do překreslení Control Panelu nebo restartu klienta.

Příklad (SQL varianta):

V tabulce Tab1 je třeba odstranit sloupec A, přidat sloupec NewCol, vytvořit pro něj neunikátní index a nastavit referenční integritu s nadřízenou tabulkou Tab2, změnit implicitní hodnotu ve sloupci D, vytvořit primární klíč na sloupci B a zároveň změnit integritní omezení pro tento sloupec.

ALTER TABLE Tab1 
DROP COLUMN A,
ADD COLUMN NewCol CHAR(20) COLLATE CSISTRING,
ALTER COLUMN D SET DEFAULT CURRENT_DATE,
ADD PRIMARY KEY (B) ,
ADD CONSTRAINT `Pro ref.integ.` INDEX (NewCol) ,
DROP CONSTRAINT `Check_B`,
ADD CONSTRAINT `Check_B` CHECK (B > 0) ,
ADD CONSTRAINT `Tab1-Tab2` FOREIGN KEY (NewCol) REFERENCES Tab2 (Col) ON UPDATE CASCADE ON DELETE NO ACTION

Odlišnosti od normy

Viz

Seznam subsekcí: