sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)でテーブルの名前を変更する

    SQL Serverでは、sp_renameを使用できます テーブルを含むオブジェクトの名前を変更するためのストアドプロシージャ。

    他の主要なRDBMのほとんどでは、ALTER TABLEを使用してテーブルの名前を変更できます。 ステートメントですが、SQLServerの場合はそうではありません。

    デモンストレーションの例を次に示します。

    EXEC sp_rename 't1', 't2';

    これにより、t1というテーブルの名前が変更されます t2へ 。

    スキーマ名を含める

    最初のテーブルをスキーマ名で修飾することもできます。その場合、次のようになります。

    EXEC sp_rename 'dbo.t1', 't2';

    この例では、dbo はスキーマ名ですが、該当するスキーマを使用する必要があります。

    パラメータ名を含める

    他のストアドプロシージャと同様に、sp_renameを呼び出すときにパラメータ名を含めることもできます :

    EXEC sp_rename 
        @objname = 'dbo.t1',
        @newname = 't2';

    sp_rename プロシージャは@objtypeも受け入れます パラメータですが、テーブルの名前を変更する場合、これは必須ではありません(またはサポートされていません)。

    参照を確認する

    SQL Serverでテーブルの名前を変更すると、おそらく次のようなメッセージが表示されます。

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

    これは、テーブルの名前を変更するときに、SQLServerがしないためです。 そのテーブルへの参照の名前を自動的に変更します。これは、列の名前を変更する場合にも当てはまります。

    上記の警告メッセージにもかかわらず、テーブルの名前はとにかく変更されます。

    したがって、テーブルの名前を変更する前に、そのテーブルを参照するスクリプトとストアドプロシージャを常に確認する必要があります。新しいテーブル名を参照するには、このようなスクリプトとプロシージャを更新する必要があります。

    sys.sql_expression_dependenciesを使用できます このチェックを行うためのシステムカタログビュー。

    例:

    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');

    この場合、sys.objectsで結合しました 詳細情報を返します。

    t1の名前を変更する前に得られた結果は次のとおりです。 テーブル:

    +----------------------+----------------------+----------+---------------------+----------+
     | 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       |
     +----------------------+----------------------+----------+---------------------+----------+ 

    これは、t1に依存する1つのビュー、1つのストアドプロシージャ、および計算列があることを示しています。 テーブル。計算列(c2c1を参照します 同じテーブルの列。

    前述のように、テーブルの名前を変更する前に、このチェックを実行することが重要です。テーブルの名前を変更した後、同じスクリプトを実行したときに得られる結果は次のとおりです。

    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');

    結果:

    (0 rows affected) 

    この場合、テーブルの元の名前(t1)を使用しました )、したがって、正しいテーブル(t2)をターゲットにしていないことは明らかです。 。

    このスクリプトを変更して新しいテーブル名を参照するだけでも機能しません。たとえば、テーブルの名前をt1から変更した後、次のスクリプトを実行します。 t2へ 1つの依存関係(計算された列)のみを返します。

    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');

    結果:

    +----------------------+------------+----------+---------------------+----------+
     | Referencing Entity   | Type       | Column   | Referenced Entity   | Column   |
     |----------------------+------------+----------+---------------------+----------|
     | t2                   | USER_TABLE | c2       | t2                  | c1       |
     +----------------------+------------+----------+---------------------+----------+ 

    良いニュースは、計算された列が返されることです。悪いニュースは、ビューとストアドプロシージャが返されないことです。

    結論:テーブルの名前を変更する前に、依存関係を確認してください。次に、名前が変更されたテーブルを参照するオブジェクトを手動で更新します。


    1. SQLiteDatabase android IllegalStateException

    2. macOSでのmy.cnfファイルの場所

    3. 異なるデータベース間のMySQLInnoDB外部キー

    4. MariaDBでのCONV()のしくみ