|
![]() | Jazyk SQL a jeho implementace | Popis syntaxe jazyka SQL | ![]() |
Některé detaily implementace jazyka SQL a práce SQL serveru lze nastavit pomocí tzv. příznaků kompatibility. Týká se to oblastí, které nejsou v normě jazyka SQL specifikovány nebo které se ve starších verzích 602SQL chovaly odlišně, než předepisují nové normy jazyka SQL. Aby byla zachována nezměněná funkce starších aplikací a přitom aby bylo možno vytvářet nové aplikace v souladu s normami SQL, umožňuje server 602SQL nastavit, do jaké míry se má zachovat kompatibilita funkce se staršími verzemi.
Kupříkladu pokud je při vytváření odpovědi na dotaz požadována typová konverze, kterou nelze provést, starší verze 602SQL vracely hodnotu NULL, zatímco dle normy má celá operace skončit neúspěchem.
Po připojení se nového klienta na server jsou všechny jeho volby nastaveny dle vlastnosti serveru DefaultSQLOption. Pokud hodnota této vlastnosti není změněna, je zapnuta ve všech volbách kompatibilita se staršími verzemi 602SQL. Interaktivní nastavování této vlastnosti umožňuje okno Provozní parametry, záložka Kompatibilita SQL, které je přístupné ze složky Systém na Řídicím panelu.
Nastavení příznaků kompatibility lze libovolně měnit i za běhu aplikace a pro různé klienty mohou ve stejném okamžiku platit různá nastavení. Změnu nastavení provádí klient voláním API funkce Set_sql_option. Aktuální nastavení vrací funkce Get_sql_option. V prostředí SQL serveru lze aktuální nastavení číst a měnit pomocí systémové proměnné @@SQLOPTIONS.
Přehled příznaků kompatibility:
jméno volby | hodn. | čeho se týká | stav je-li nastaveno (602sql syntax) | stav není-li nastaveno (SQL syntax) |
SQLOPT_NULLEQNULL | 1 | porovnání dvou hodnot NULL (*), ovlivňuje vyhodnocování některých dotazů | výsledek je TRUE | výsledek je UNKNOWN |
SQLOPT_NULLCOMP | 2 | operace mezi NULL a jinou hodnotou (*) | NULL je menší v relacích a je inertním prvkem v ostatních operacích | výsledek relací je UNKNOWN, ostatních operací NULL |
SQLOPT_RD_PRIVIL_VIOL | 4 | použití hodnoty, k níž není právo čtení, při konstrukci kurzoru | místo utajené hodnoty se použije NULL | dojde k chybě NO_RIGHTS |
SQLOPT_MASK_NUM_RANGE | 8 | přetečení číselného rozsahu při konverzi | výsledkem je NULL | dojde k chybě SQ_NUM_VAL_OUT_OF_RANGE |
SQLOPT_MASK_INV_CHAR | 16 | řetězec znaků nelze konvertovat na požadovaný typ | výsledkem je NULL | dojde k chybě SQ_INV_CHAR_VAL_FOR_CAST |
SQLOPT_MASK_RIGHT_TRUNC | 32 | při typové konverzi na typ řetězec dochází ke ztrátě znaků na pravém konci | znaky jsou ztraceny | dojde k chybě SQ_STRING_DATA_RIGHT_TRU |
SQLOPT_EXPLIC_FREE | 64 | zrušení a uvolnění záznamu | zrušené záznamy se uvolňují funkcí Free_deleted | zrušené záznamy se uvolňují ihned po zrušení |
SQLOPT_OLD_ALTER_TABLE | 128 | syntaxe ALTER TABLE | použije se původní varianta ALTER TABLE (stejné jako návrhář) | používá se varianta ALTER TABLE podle normy SQL |
SQLOPT_DUPLIC_COLNAMES | 256 | když se dva sloupce v odpovědi na dotaz jmenují stejně | ponechají se stejná jména, lze je rozlišit pomocí prefixu | sloupce se automaticky přejmenují |
SQLOPT_USER_AS_SCHEMA | 512 | prefixování jmen tabulek jménem uživatele | prefix se vždy považuje za jméno schématu | pokud se prefix shoduje se jménem přihlášeného uživatele, ignoruje se |
SQLOPT_DISABLE_SCALED | 1024 | výskyt číselných necelých přesných typů v odpovědi na dotaz (NUMERIC) | pokud nelze považovat za zastaralý typ Money, je automaticky konvertován na typ Real | typ se zachová |
SQLOPT_ERROR_STOPS_TRANS | 2048 | reakce transakce na chybu | transakce se ukončí | transakce pokračuje až do commitu nebo rollbacku |
SQLOPT_NO_REFINT_TRIGGERS | 4096 | spouštění triggerů při provádění akcí aktivní referenční integrity | triggery se nespouštějí | triggery se spouštějí |
SQLOPT_USE_SYS_COLS | 8192 | výběr i systémových sloupců (_W5_ ...) v klauzuli SELECT * | vyberou se všechny sloupce včetně systémových | systémové sloupce se nevyberou |
SQLOPT_CONSTRS_DEFERRED | 16384 | kdy se má vyhodnocovat porušení těch omezení tabulky (s výjimkou UNIQUE), které nejsou nastaveny explicitně | chyba se projeví při commitu (DEFERRED) | chyba se projeví okamžitě (IMMEDIATE) |
SQLOPT_COL_LIST_EQUAL | 32768 | kdy se provede UPDATE trigger se seznamem sloupců | je-li změněna stejná množina sloupců | pokud množina změněných sloupců má neprázdný průnik se seznamem |
SQLOPT_QUOTED_IDENT | 65536 | jak se interpretují uvozovky v SQL | uvozovky vymezují řetězec znaků, stejně jako apostrof | uvozovky vymezují identifikátor, stejně jako obrácený apostrof; pro ODBC driver platí vždy bez ohledu na nastavení |
SQLOPT_GLOBAL_REF_RIGHTS | 131072 | užití práv při vytváření odpovědi na dotaz | vyžaduje se globální právo čtení k těm sloupcům, které jsou použity v podmínkách | nevyžaduje se globální právo čtení ke sloupcům, záznamy bez dostatečných práv se nezařadí do odpovědi |
SQLOPT_REPEATABLE_RETURN | 262144 | chování příkazu RETURN v těle funkce | příkaz RETURN definuje návratovou hodnotu, ale neukončuje provádění příkazů | bezprostředně po provedení příkazu RETURN funkce skončí |
SQLOPT_OLD_STRING_QUOTES | 524288 | označování řetězců | uvozovka a apostrof jsou rozdílné znaky pro označení řetězce, nelze psát SET retez = "aaa' (od verze 9.0) | uvozovka i apostrof mají stejný význam pro označení řetězce, lze psát SET retez = "aaa' (jako ve verzích 8.x) |
(*) pro řetězce s hodnotou NULL (= prázdné řetězce) platí bez ohledu na nastavení údaje ze sloupce Syntax WB (porovnání dvou NULL stringů je TRUE apod.).
![]() | Jazyk SQL a jeho implementace | Popis syntaxe jazyka SQL | ![]() |