Jak zmienić nazwę kolumny bez uszkadzania definicji innych obiektów w bazach SQL Server’a

Zmiana nazwy kolumny w tabeli lub widoku nie jest czynnością wykonywaną zbyt często przez programistów baz danych. Nie oznacza to jednak, że nie da się wykonać zmiany nazwy kolumny efektywnie i bez dużego nakładu pracy, jeżeli zaistnieje taka konieczność.

Sama zmiana nazwy kolumny nie jest czynnością trudną. Aby – na przykład – zmienić kolumnę TerritoryID w tablicy Sales.SalesTerritory na nazwę TerrID można wykorzystać poniższy skrypt:

EXECUTE sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';

Wykonując polecenie otrzymamy ostrzeżenie:

Uwaga: Zmienianie dowolnej części nazwy obiektu może spowodować błędy w skryptach lub procedurach przechowywanych.

Caution: Changing any part of an object name could break scripts and stored procedures.

Dodatkowo, może pojawić się komunikat:

Nazwa obiektu ‘Sales.SalesTerritory.TerritoryID’ nie może zostać zmieniona, ponieważ od nazwy obiektu zależą definicje innych obiektów w łańcuchu wymuszonych zależności.

Object ‘Sales.SalesTerritory.TerritoryID’ cannot be renamed because the object participates in enforced dependencies.

Jakie potencjalne błędy mogą pojawić się w skryptach?

Załóżmy, że w bazie istnieje procedura przechowywana Sales.vTer, która odwołuje się do kolumny TerritoryID w tablicy Sales.SalesTerritory. Procedura sp_rename, zmieniając nazwę kolumny TerritoryID w tablicy Sales.SalesTerritory, nie zmieni jednocześnie nazwy kolumny w procedurze przeszukiwanej Sales.vTer.

Na skutek takiej zmiany tablica Sales.SalesTerritory będzie zawierać kolumnę TerrID, a procedura składowana będzie odwoływać się do Sales.SalesTerritory.TerritoryID, która już nie istnieje. Skrypt procedury przechowywanej będzie uszkodzony a jego wykonanie skończy się błędem.

Czym są wymuszone zależności (enforced dependencies)?

Zależność jest wymuszona jeżeli obiekt odwołujący się zawiera wyrażenie przywiązane do nazwy schematu. Komunikat przedstawiony powyżej jest także widoczny, jeśli istnieją inne obiekty, które trzeba usunąć i ponownie utworzyć, podając nową nazwę kolumny, tak aby definicja była ponownie poprawna.

Jak odnaleźć procedurę składowaną lub inny obiekt, na który będzie mieć wpływ zmiana nazwy kolumny?

SQL Server Management Studio pozwala śledzić zależności, przy pomocy opcji View Dependencies. Niestety opcja tylko pokazuje obiekty, które zależą od wybranego obiektu, w przypadku zmiany nazwy kolumny nadal trzeba ręcznie odtworzyć wszystkie obiekty, które odwołują się do zmienianej nazwy.

Aby zmienić nazwę kolumny przy pomocy sp_rename, należy:

  1. Odnaleźć wszystkie obiekty, zależne od kolumny w definicji widoku lub tablicy.
  2. Usunąć wszystkie wymuszone zależności.
  3. Zmienić nazwę kolumny przy pomocy sp_rename.
  4. Odtworzyć wszystkie wymuszone zależności, usunięte w punkcie #2.
  5. Jeśli trzeba zmienić nazwę kolejnej kolumny, należy powtórzyć kroki 1 do 4.

Cały proces jest dosyć pracochłonny, więc zazwyczaj staramy się unikać go unikać.

Jak zmienić nazwę kolumny w łatwiejszy sposób?

W takiej sytuacji może pomóc ApexSQL Search. Jest to bezpłatny dodatek do SQL Server Management Studio lub Visual Studio, który pozwala znaleźć tekst w obiektach baz danych SQL Server’a oraz w danych, zawartych w tabelach lub dostępnych przez widoki. Pozwala także zmienić nazwy tabel, widoków, procedur przechowywanych, funkcji, kolumn lub schematów, bez przerywania łańcucha zależności, jednocześnie wizualizując wszystkie obiekty zależne. Aby użyć ApexSQL Search należy:

  1. Otworzyć SQL Server Management Studio lub Visual Studio.
  2. W Eksploratorze Obiektów/Eksploratorze Serwera odnaleźć tablicę, widok lub kolumnę, której nazwę chcemy zmienić.
  3. Kliknąć prawym przyciskiem myszy na kolumnę Safe rename i wybrać opcję z menu.

  4. Aby zobaczyć zmiany, które będą wykonane należy kliknąć Generate preview w oknie Safe rename column.
  5. Zakładka Generated script pokazuje skrypt, przy pomocy którego będzie wykonana zmiana nazwy kolumny.

  6. Otworzyć zakładkę Warnings aby zobaczyć informacje o potencjalnych problemach, które mogą pojawić się podczas procesu zmiany nazwy.

  7. Otworzyć zakładkę Sequence, aby zobaczyć wszystkie kroki, które będą wykonane podczas zmieniania nazwy. Kroki te są identyczne z tymi, które byłyby wykonane gdyby proces zmiany nazwy wykonywany był ręcznie przy pomocy procedury sp_rename.

  8. Otworzyć zakładkę Dependencies aby zobaczyć obiekty, które zależą od nazwy zmienianej kolumny. Definicje tych obiektów będą automatycznie zmienione. W przypadku użycia procedury sp_rename należałoby ich definicje zmienić ręcznie.

  9. Aby zmodyfikować skrypt zanim będzie wykonany, należy kliknąć przycisk Open. Wygenerowany skrypt zostanie otwarty w edytorze zapytań w SQL Server Management Studio lub edytorze Visual Studio.

    Skrypt można przejrzeć lub zmodyfikować i wykonać jak każdy inny skrypt poleceniem Execute lub zapisać go do pliku.

  10. Aby wykonać skrypt należy kliknąć przycisk Rename.

Zmiana nazwy kolumny może być prosta i nic nie kosztować. Nie trzeba analizować całej bazy danych i szukać ręcznie zależności między definicjami obiektów. Można wykorzystać ApexSQL Search narzędzie które odnajdzie wszystkie zależności i automatycznie wykona wszystkie modyfikacje, usuwając i odtwarzając obiekty jeśli to konieczne.

Tłumacz: Anna Lesniak

November 4, 2015