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

Saving changes is not permitted

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.

Rate this post

Použité zdroje
  1. 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
  2. Tutorials Point, SQL – ALTER TABLE Command [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://www.tutorialspoint.com/sql/sql-alter-command.htm
  3. W3schools, SQL ALTER COLUMN Keyword [on-line]. [cit. 2023-01-17]. Dostupné z WWW: https://www.w3schools.com/sql/sql_ref_alter_column.asp
  4. 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

Ing. Jan Zedníček - Data Engineer & Controlling

Jmenuji se Honza Zedníček a působím jako freelancer. Pracoval jsem dříve také jako BI developer, finanční controller a analytik. Vše pro společnosti z oblasti IT, bankovnictví, consultingu a výroby. Po práci si rád zahraju tenis, volejbal, šachy, zajdu do posilovny a občas neúspěšně odpálím pár balónků v golfu 🏌️

Již cca 10 let zapisuji na tento web různé návody určené zejména odborné veřejnosti, studentům a zájemcům o informace z oblastí Business intelligence, korporátních financí a reportingu.

🔥 Přihlašte se do naší Excel facebook skupiny (2.4k+ členů), kde si pomáháme Excel CZ/SK diskuse »

Leave a Reply

Your email address will not be published. Required fields are marked *