sql >> Databáze >  >> RDS >> Sqlserver

Přejmenování tabulky v SQL Server (T-SQL)

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.


  1. Jedinečná modelová pole v Django nerozlišují malá a velká písmena?

  2. Rozdíl mezi LIKE a =v MYSQL?

  3. Jak používat SQL Server HierarchyID prostřednictvím jednoduchých příkladů

  4. Nastavení hesla uživatele root MySQL na OS X