V SQL Server můžete použít sp_rename
uložená procedura k přejmenování objektu včetně tabulky.
Většina ostatních hlavních RDBM vám umožňuje přejmenovat tabulku pomocí ALTER TABLE
příkaz, ale to není případ SQL Server.
Příklad
Zde je příklad k demonstraci:
EXEC sp_rename 't1', 't2';
Tím se přejmenuje tabulka nazvaná t1
na t2
.
Včetně názvu schématu
První tabulku můžete také kvalifikovat názvem schématu, v takovém případě může vypadat nějak takto:
EXEC sp_rename 'dbo.t1', 't2';
V tomto příkladu dbo
je název schématu, ale budete muset použít jakékoli použitelné schéma.
Včetně názvů parametrů
Stejně jako u jakékoli uložené procedury můžete také při volání sp_rename
zahrnout názvy parametrů :
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
procedura také přijímá @objtype
Tento parametr však není vyžadován (ani podporován) při přejmenovávání tabulek.
Kontrola referencí
Když přejmenujete tabulku na serveru SQL Server, pravděpodobně se vám zobrazí tato zpráva:
Caution: Changing any part of an object name could break scripts and stored procedures.
Důvodem je, že když přejmenujete tabulku, SQL Server to nedělá automaticky přejmenovat všechny odkazy na tuto tabulku. To platí také při přejmenování sloupce.
Přes výše uvedenou varovnou zprávu je tabulka stejně přejmenována.
Před přejmenováním tabulek byste proto měli vždy zkontrolovat skripty a uložené procedury, které na danou tabulku odkazují. Tyto skripty a procedury budete muset aktualizovat, aby odkazovaly na nový název tabulky.
Můžete použít sys.sql_expression_dependencies
k provedení této kontroly.
Příklad:
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
V tomto případě jsem to spojil s sys.objects
vrátit další informace.
Zde je výsledek, který dostanu, než jsem změnil název t1
tabulka:
+----------------------+----------------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+----------------------+----------+---------------------+----------| | usp_t1 | SQL_STORED_PROCEDURE | (n/a) | t1 | (n/a) | | vt1 | VIEW | (n/a) | t1 | (n/a) | | t1 | USER_TABLE | c2 | t1 | c1 | +----------------------+----------------------+----------+---------------------+----------+
To mi ukazuje, že existuje jeden pohled, jedna uložená procedura a vypočítaný sloupec, které závisí na t1
stůl. Vypočítaný sloupec (c2
) odkazuje na c1
sloupec ve stejné tabulce.
Jak již bylo zmíněno, je důležité provést tuto kontrolu předtím, než změníte název tabulky. Zde je výsledek, který dostanu při spuštění stejného skriptu po změně názvu tabulky.
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't1');
Výsledek:
(0 rows affected)
V tomto případě jsem použil původní název tabulky (t1
), takže je zcela zřejmé, že jsme ani nezacílili na správnou tabulku (t2
).
Pouhá změna tohoto skriptu tak, aby odkazoval na nový název tabulky, také nebude fungovat. Například spuštěním následujícího skriptu poté, co jsme změnili název tabulky z t1
na t2
vrátí pouze jednu závislost (vypočítaný sloupec).
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],
o.type_desc AS [Type],
COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
referenced_entity_name AS [Referenced Entity],
COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id
WHERE referenced_id = OBJECT_ID(N't2');
Výsledek:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
Dobrou zprávou je, že se vrátí vypočítaný sloupec. Špatnou zprávou je, že zobrazení a uložená procedura nejsou vráceny.
Sečteno a podtrženo:Před přejmenováním tabulky zkontrolujte závislosti. Potom ručně aktualizujte všechny objekty, které odkazují na přejmenovanou tabulku.