I SQL Server kan du bruge sp_rename
gemt procedure til at omdøbe et objekt, inklusive en tabel.
De fleste af de andre større RDBM'er giver dig mulighed for at omdøbe en tabel med ALTER TABLE
sætning, men dette er ikke tilfældet med SQL Server.
Eksempel
Her er et eksempel til demonstration:
EXEC sp_rename 't1', 't2';
Dette omdøber tabellen kaldet t1
til t2
.
Inklusive skemanavnet
Du kan også kvalificere den første tabel med skemanavnet, i hvilket tilfælde det kan se sådan ud:
EXEC sp_rename 'dbo.t1', 't2';
I dette eksempel, dbo
er skemanavnet, men du skal bruge det skema, der er relevant.
Inklusive parameternavnene
Som med enhver lagret procedure kan du også inkludere parameternavnene, når du kalder sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
procedure accepterer også en @objtype
parameter, men dette er ikke påkrævet (eller understøttet), når du omdøber tabeller.
Søg efter referencer
Når du omdøber en tabel i SQL Server, vil du sandsynligvis se en meddelelse som denne:
Forsigtig:Ændring af en hvilken som helst del af et objektnavn kan ødelægge scripts og lagrede procedurer.
Dette skyldes, at SQL Server ikke gør det, når du omdøber en tabel automatisk omdøbe eventuelle referencer til den tabel. Dette gælder også, når du omdøber en kolonne.
På trods af ovenstående advarselsmeddelelse omdøbes tabellen alligevel.
Før du omdøber nogen tabeller, bør du derfor altid tjekke for scripts og lagrede procedurer, der refererer til den tabel. Du bliver nødt til at opdatere sådanne scripts og procedurer for at referere til det nye tabelnavn.
Du kan bruge sys.sql_expression_dependencies
systemkatalogvisning for at udføre denne kontrol.
Eksempel:
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 dette tilfælde sluttede jeg mig til det med sys.objects
for at returnere flere oplysninger.
Her er resultatet, jeg får, før jeg ændrede navnet på t1
tabel:
+-----------------------------+-----------------------------+ ----------+----------------------------+----------+ | Referenceenhed | Skriv | Kolonne | Referenceret enhed | Kolonne | |----------------------+----------------------+--- -------+----------------------------+-----------| | usp_t1 | SQL_STORED_PROCEDURE | (n/a) | t1 | (n/a) | | vt1 | SE | (n/a) | t1 | (n/a) | | t1 | USER_TABLE | c2 | t1 | c1 | +----------------------+----------------------+--- -------+----------------------------+----------+
Dette viser mig, at der er én visning, én lagret procedure og en beregnet kolonne, der afhænger af t1
bord. Den beregnede kolonne (c2
) refererer til c1
kolonne i samme tabel.
Som nævnt er det vigtigt at køre dette tjek, før du ændrer navnet på tabellen. Her er resultatet, jeg får, når jeg kører det samme script efter at have ændret navnet 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 rækker påvirket)
I dette tilfælde brugte jeg tabellens oprindelige navn (t1
), så det er helt indlysende, at vi ikke engang målrettede den korrekte tabel (t2
).
Blot at ændre dette script for at referere til det nye tabelnavn virker heller ikke. For eksempel at køre følgende script, efter at vi har ændret navnet på tabellen fra t1
til t2
returnerer kun én afhængighed (den beregnede kolonne).
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:
+-----------------------+------------+-------- +----------------------------+----------+ | Referenceenhed | Skriv | Kolonne | Referenceret enhed | Kolonne | |----------------------+------------------ ------------------+--------| | t2 | USER_TABLE | c2 | t2 | c1 | +------------------------------------------- ------------------+----------+
Den gode nyhed er, at den beregnede kolonne returneres. Den dårlige nyhed er, at visningen og den lagrede procedure ikke returneres.
Nederste linje:Tjek for afhængigheder, før du omdøber tabellen. Opdater derefter manuelt alle objekter, der refererer til den omdøbte tabel.