W SQL Server możesz użyć sp_rename
procedura składowana do zmiany nazwy obiektu, w tym tabeli.
Większość innych głównych RDBM umożliwia zmianę nazwy tabeli za pomocą ALTER TABLE
oświadczenie, ale tak nie jest w przypadku SQL Server.
Przykład
Oto przykład do zademonstrowania:
EXEC sp_rename 't1', 't2';
Zmienia to nazwę tabeli o nazwie t1
do t2
.
W tym nazwa schematu
Możesz również zakwalifikować pierwszą tabelę nazwą schematu, w takim przypadku może to wyglądać mniej więcej tak:
EXEC sp_rename 'dbo.t1', 't2';
W tym przykładzie dbo
to nazwa schematu, ale musisz użyć dowolnego schematu.
W tym nazwy parametrów
Podobnie jak w przypadku każdej procedury składowanej, można również dołączyć nazwy parametrów podczas wywoływania sp_rename
:
EXEC sp_rename
@objname = 'dbo.t1',
@newname = 't2';
sp_rename
procedura akceptuje również @objtype
parametr, ale nie jest to wymagane (lub obsługiwane) podczas zmiany nazw tabel.
Sprawdź referencje
Gdy zmienisz nazwę tabeli w SQL Server, prawdopodobnie zobaczysz taki komunikat:
Caution: Changing any part of an object name could break scripts and stored procedures.
Dzieje się tak, ponieważ po zmianie nazwy tabeli SQL Server nie automatycznie zmień nazwy wszystkich odwołań do tej tabeli. Dotyczy to również zmiany nazwy kolumny.
Pomimo powyższego ostrzeżenia, nazwa tabeli i tak została zmieniona.
Dlatego przed zmianą nazw tabel należy zawsze sprawdzić skrypty i procedury składowane, które odwołują się do tej tabeli. Będziesz musiał zaktualizować takie skrypty i procedury, aby odwoływały się do nowej nazwy tabeli.
Możesz użyć sys.sql_expression_dependencies
widok katalogu systemowego, aby to sprawdzić.
Przykład:
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');
W tym przypadku dołączyłem do niego za pomocą sys.objects
aby zwrócić więcej informacji.
Oto wynik, który otrzymałem, zanim zmieniłem nazwę t1
tabela:
+----------------------+----------------------+----------+---------------------+----------+ | 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 pokazuje mi, że istnieje jeden widok, jedna procedura składowana i kolumna obliczona, które zależą od t1
stół. Obliczona kolumna (c2
) odwołuje się do c1
kolumna w tej samej tabeli.
Jak wspomniano, ważne jest, aby przeprowadzić tę kontrolę przed zmianą nazwy tabeli. Oto wynik, który otrzymuję po uruchomieniu tego samego skryptu po zmianie nazwy tabeli.
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');
Wynik:
(0 rows affected)
W tym przypadku użyłem oryginalnej nazwy tabeli (t1
), więc jest całkiem oczywiste, że nie celowaliśmy nawet w odpowiednią tabelę (t2
).
Po prostu zmiana tego skryptu, aby odwoływać się do nowej nazwy tabeli, również nie zadziała. Na przykład uruchomienie następującego skryptu po zmianie nazwy tabeli z t1
do t2
zwraca tylko jedną zależność (kolumnę wyliczoną).
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');
Wynik:
+----------------------+------------+----------+---------------------+----------+ | Referencing Entity | Type | Column | Referenced Entity | Column | |----------------------+------------+----------+---------------------+----------| | t2 | USER_TABLE | c2 | t2 | c1 | +----------------------+------------+----------+---------------------+----------+
Dobrą wiadomością jest to, że obliczona kolumna jest zwracana. Zła wiadomość jest taka, że widok i procedura składowana nie są zwracane.
Konkluzja:Sprawdź zależności przed zmianą nazwy tabeli. Następnie ręcznie zaktualizuj wszystkie obiekty, które odwołują się do tabeli o zmienionej nazwie.