Dříve jsem napsal větší článek, vé kterém jsem popisoval jak založit View v sql. V tomto článku se nenápadně nachází jeden SQL příkaz, který bych chtěl více objasnit zde. Jde o příkaz SCHEMABINDING, který se používá při založení view. SCHEMABINDING si můžeme představit jako hlídacího psa. Ten kontroluje, jestli v podkladové tabulce nedochází ke změnám, které by způsobily nefunkčnost view.
Co znamená příkaz WITH SCHEMABINDING s příkladem
Jednoduše řečeno to znamená, že vytvářené view je svázáno se strukturou podkladových objektů, ze kterých view vzniká. Jestliže založíte view s touto volbou, tak dojde k tomu, že jestliže se pokusíte změnit strukturu podkladové tabulky, tak vás to změnu nenechá udělat. Tímto si můžete tedy můžete hlídat a kontrolovat konzistenci view tak, aby nedocházelo k tomu, že se podkladové tabulky změní a view pak nebude fungovat.
Příklad: Na příkladu ukážu jak schemabinding funguje.
1) Zdrojovými daty pro mě bude tabulka se zaměstnanci, se kterou jsem pracoval v několika minulých článcích. Skript pro založení tabulky najdete v článku – Jak správně vytvořit parent-child strukturu
2) Vytvoříme nad tabulkou view se schemabindingem a ve view necháme zobrazit všechny sloupce tabulky
CREATE VIEW udv_zamestnanec
WITH SCHEMABINDING
AS
SELECT
[id_zamestnanec]
,[id_nadrizeny]
,[pozice]
,[jmenoprijmeni]
,[plat]
FROM [dbo].[zamestnanci]
Commands completed successfully
3) Přidáme 1 sloupec z podkladové tabulky “zamestnanci”
ALTER TABLE [dbo].[zamestnanci]
ADD Test_schemabinding INT NULL;
V tomto případě nás schemabinding nezastaví a přidání sloupce proběhne v pořádku, protože přidání tohoto sloupce nemá na view vliv.
4) Vymažeme z tabulky “zamestnanci” sloupec [plat], což už by tedy měl být výrazný problém, protože by to způsobilo při dotazu na view udv_zamestnanec jeho pád
ALTER TABLE [dbo].[zamestnanci]
DROP COLUMN [plat]
SQL vypsal chybu a drop sloupce neprovedl:
Msg 5074, Level 16, State 1, Line 4
The object ‘udv_zamestnanec’ is dependent on column ‘plat’.
Msg 4922, Level 16, State 9, Line 4
ALTER TABLE DROP COLUMN plat failed because one or more objects access this column.
Časté chyby při založení View se SCHEMABINDING (Errors)
1) Cannot schema bind view ‘tabulka’ because name ‘<databaze>.<schema>.<tabulka>’ is invalid for schema binding. Names must be in two-part format and an object cannot reference itself – tato chyba říká, že view musí být založeno bez definované databáze. To znamená, že pokud chceme založit view se schemabinding, tak musí být umístěny všechny objekty v rámci view ve stejné databázi jako view samotné
2) The object ‘tabulka’ is dependent on column ‘sloupec’. ALTER TABLE DROP COLUMN sloupec failed because one or more objects access this column. – Chyba vzniká pokud se pokusíme vymazat z tabulky sloupec a současně je tento sloupec používán ve view with schemabinding.
3) Syntax ‘*’ is not allowed in schema-bound objects. – Při založení view se schemabindingem musí být všechny sloupce exaktně vyjmenovány, nelze používat SELECT *
4) Cannot create index on view ‘nazev_view’ because the view is not schema bound. – Pokud chceme vytvořit indexované view, tak toto view musí být witch schemabinding. Tento error se nám vypíše, když se snažíme založit index nad view, které nesplňuje tuto podmínku.