I SQL Server kan du använda sp_rename
lagrad procedur för att byta namn på ett objekt, inklusive en tabell.
De flesta av de andra stora RDBM:erna låter dig byta namn på en tabell med ALTER TABLE
uttalande, men detta är inte fallet med SQL Server.
Exempel
Här är ett exempel att visa:
EXEC sp_rename 't1', 't2';
Detta byter namn på tabellen som heter t1
till t2
.
Inklusive schemanamnet
Du kan också kvalificera den första tabellen med schemanamnet, i så fall kan den se ut ungefär så här:
EXEC sp_rename 'dbo.t1', 't2';
I det här exemplet, dbo
är schemanamnet, men du måste använda vilket schema som är tillämpligt.
Inklusive parameternamnen
Som med alla lagrade förfaranden kan du även inkludera parameternamnen när du anropar sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
proceduren accepterar också en @objtype
parameter, men detta krävs (eller stöds) inte när du byter namn på tabeller.
Sök efter referenser
När du byter namn på en tabell i SQL Server kommer du förmodligen att se ett meddelande så här:
Caution: Changing any part of an object name could break scripts and stored procedures.
Detta beror på att SQL Server inte gör det när du byter namn på en tabell byter automatiskt namn på alla referenser till den tabellen. Detta gäller även när du byter namn på en kolumn.
Trots varningsmeddelandet ovan har tabellen bytt namn ändå.
Innan du byter namn på några tabeller bör du därför alltid leta efter skript och lagrade procedurer som refererar till den tabellen. Du måste uppdatera sådana skript och procedurer för att referera till det nya tabellnamnet.
Du kan använda sys.sql_expression_dependencies
systemkatalogvy för att göra denna kontroll.
Exempel:
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');
I det här fallet gick jag ihop med sys.objects
för att returnera mer information.
Här är resultatet jag fick innan jag ändrade namnet på t1
tabell:
+----------------------+----------------------+----------+---------------------+----------+ | 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 | +----------------------+----------------------+----------+---------------------+----------+
Det här visar mig att det finns en vy, en lagrad procedur och en beräknad kolumn som beror på t1
tabell. Den beräknade kolumnen (c2
) refererar till c1
kolumn i samma tabell.
Som nämnts är det viktigt att köra den här kontrollen innan du ändrar namnet på tabellen. Här är resultatet jag får när jag kör samma skript efter att ha ändrat namnet på tabellen.
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');
Resultat:
(0 rows affected)
I det här fallet använde jag tabellens ursprungliga namn (t1
), så det är ganska uppenbart att vi inte ens riktade in oss på rätt tabell (t2
).
Att helt enkelt ändra det här skriptet för att referera till det nya tabellnamnet fungerar inte heller. Till exempel köra följande skript efter att vi har ändrat namnet på tabellen från t1
till t2
returnerar bara ett beroende (den beräknade kolumnen).
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');
Resultat:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
Den goda nyheten är att den beräknade kolumnen returneras. Den dåliga nyheten är att vyn och den lagrade proceduren inte returneras.
Slutsats:Kontrollera om det finns beroenden innan du byter namn på tabellen. Uppdatera sedan manuellt alla objekt som refererar till den omdöpta tabellen.