SQL příkaz ALTER TABLE řadíme spolu s napříkald CREATE TABLE příkazem do tzv. DDL (Data definition language) příkazů. Umožňuje nám nějakým způsobem změnit definici tabulky. Změnou nad SQL Server tabulkou může být například.
- přidání nového sloupce
- smazání sloupce
- změna datového typu nebo deifnice sloupce
- změna názvu sloupce
Chybová hláška – Saving changes is not permitted
Možná jste se s touto chybovou hláškou už setkali. Vysvětlení lze nalézt v technické dokumentaci Microsoftu 1
Některé DDL operace můžeme udělat rovnou z UI nějakého nástroje pro správu SQL Server databáze – typicky SQL Management Studio, například tak, že tabulku zeditujeme a provedeme změny bez nutnosti použít skript. To je třeba příklad přidání nového sloupce. Některé změny, ale takto provádět nelze – například změna datového typu sloupce nebo jeho názvu, proto DDL operace typicky provádíme prostřednictvím T-SQL skriptu.
Důvodem je to, že defaultně je v nastavění management studio zapnutý check, který kontroluje zda se s tabulkou nepokoušíme dělat nějaké nepěknosti, které by způsobily ztrátu nebo změnu původních metadat nebo hodnot tabulky. V podstatě je to nějaká ochrana uživatele.
Pokud bychom například změnili datový typ z varchar(1000) na varchar(1) tak nad daným sloupcem příjdeme o většinu dat – osekají se nám na 1. znak.
Tomu SQL management studio svým defaultním nastavením Object exploreru (UI) zamezuje a tyto nepěknosti nás nenechá udělat. Respektive nechá, ale jen přes SQL skript. Předpokladem pro vykonání podobných operací nad tabulkou v produkčním prostředí je hlavně svéprávnost a to, že vím co dělám. Pokud to nevím, tak si to někde bokem otestuju, zazálohuju a teprve potom konám v produkci.
Výše popsané “chování” v UI se dá vypnout
- V management studiu kliknem na Tools – Options
- V Options najdeme položku designers
- Odškrtneme odnačený checkbox
Obecná definice ALTER TABLE nad SQL Serverem
Syntaxe SQL DDL příkazu vypadá většinou takto 2 3
- začínáme vždy s ALTER TABLE
- následně napíšme co chceme dělat (akce ADD, ALTER nebo DROP) a v případě změny jak má nový datový typ vypadat
ALTER TABLE [nazev_tabulky]
(ADD, ALTER COLUMN, DROP COLUMN) [nazev_sloupce] nova_definice;
Výjimku tvoří přejmenování sloupce, které se dělá přes systémovou proceduru (viz. dále). Tak a můžeme se vrhnout na jednotlivé situace, které budeme chtít řešit.
ADD – Přídání sloupce do tabulky pomocí ALTER TABLE
Níže je příkaz, který do tabulky “Ja_jsem_tabulka” přidá sloupec s názvem “ID”, který nemůže být prázdný.
ALTER TABLE [Databaze].[schema].[Ja_jsem_tabulka]
ADD [ID] INT NOT NULL;
ALTER COLUMN – Změna definice sloupce pomocí ALTER TABLE
Níže je zase skript, který existující sloupec v tabulce “Ja_jsem_tabulka” s názvem “ID” změní a nastaví mu místo původního datového typu BIGINT a definujeme, že může být NULL
ALTER TABLE [Databaze].[schema].[Ja_jsem_tabulka]
ALTER COLUMN [ID] BIGINT NULL;
DROP – Smazání sloupce v tabulce pomocí ALTER TABLE
Pokud chci sloupec “ID” v tabulce “Ja_jsem_tabulka” úplně zahodit se všemi potenciálními dopady, tak použiju konstrukci níže. Definici sloupce jako v předchozích případech logicky nepotřebujeme.
ALTER TABLE [Databaze].[schema].[Ja_jsem_tabulka]
DROP COLUMN [ID];
sp_rename – Přejmenování sloupce v tabulce (systémová procedura)
U přejmenování sloupce se SQL Server od ostatních platforem trošku liší a přejmenování můžeme dělat jenom přes speciální systemovou proceduru (system storage procedure) sp_rename 4
sp_rename ‘schema.tabulka.sloupec_stary’, ‘novysloupec’, ‘COLUMN’;
Takže v případě, že bychom chtěli přejmenovat v tabulce “Ja_jsem_tabulka” sloupec “ID” na sloupec “ID_NO” tak by to vypadalo takto:
sp_rename ‘dbo.Ja_jsem_tabulka.ID’, ‘ID_NO’, ‘COLUMN’;
Parametr column do procedury dodáváme aby bylo bez pochybností, že chceme renamovat sloupec. Pomocí této procedury se dá měnit i název tabulky pakliže tento parametr (COLUMN) nezadáme.
Použité zdroje
- Microsoft, Saving changes is not permitted error message in SSMS [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://learn.microsoft.com/en-us/troubleshoot/sql/ssms/error-when-you-save-table
- Tutorials Point, SQL – ALTER TABLE Command [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://www.tutorialspoint.com/sql/sql-alter-command.htm
- W3schools, SQL ALTER COLUMN Keyword [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://www.w3schools.com/sql/sql_ref_alter_column.asp
- Microsoft dokumentace, sp_rename (Transact-SQL) [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-ver16