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

SQLServerデータベースで外部キー制約を再作成するスクリプトを生成する方法-SQLServer/TSQLチュートリアルパート73

    シナリオ:

    SQL Serverデータベース内のすべてのテーブルを切り捨てる必要があります。truncateステートメントを実行すると、エラー以下のエラーが発生します。
    メッセージ4712、レベル16、状態1、43行目
    テーブルのSchemaNameを切り捨てることはできません。 TableName'は、FOREIGNKEY制約によって参照されているためです。

    簡単な方法は、外部キー制約を削除し、テーブルを切り捨てて、外部キー制約を再作成することです。

    データベースで外部キーの削除制約を生成するために使用できる投稿を書きました。ここをクリック。
    ただし、それらを削除する前に、テーブルを切り捨てた後に実行できるように、外部キー制約の作成スクリプトを生成する必要があります。

    以下のスクリプトを使用して、すべてのデータベースからのユーザーテーブル。

    Select 'Truncate table '+'['
    +Schema_name(Schema_id)
    +'].['+name+']' as TruncateTablesScript
    from sys.tables
    where is_ms_shipped=0
     
    以下のスクリプトを使用して、データベースで外部キー制約を再生成できます。

    ;With CTE_FK AS (
    SELECT Schema_Name(Schema_id) as TableSchemaName,
      object_name(FK.parent_object_id) ParentTableName,
      object_name(FK.referenced_object_id) ReferenceTableName,
      FK.name AS ForeignKeyConstraintName,c.name as RefColumnName,
      cf.name as ParentColumnList
           FROM sys.foreign_keys AS FK
           INNER JOIN sys.foreign_key_columns AS FKC
                   ON FK.OBJECT_ID = FKC.constraint_object_id
                   INNER JOIN sys.columns c
              on  c.OBJECT_ID = FKC.referenced_object_id
                     AND c.column_id = FKC.referenced_column_id
                     INNER JOIN sys.columns cf
              on  cf.OBJECT_ID = FKC.parent_object_id
                     AND cf.column_id = FKC.parent_column_id
                     where fk.is_ms_shipped=0
                     )
                     Select 
                     'Alter table ['+TableSchemaName+'].['+ParentTableName+']' 
                     +' Add Constraint '+ForeignKeyConstraintName+ 
                     ' Foreign Key('+stuff((
                     Select ','+ParentColumnList
                     from CTE_FK i
                     where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                     and i.TableSchemaName=o.TableSchemaName
                     and i.ParentTableName=o.ParentTableName
                     and i.ReferenceTableName=o.ReferenceTableName
                     for xml path('')), 1, 1, '')+') References '+
                     '['+TableSchemaName+'].['+ReferenceTableName+']('+stuff((
                     Select ','+RefColumnName
                     from CTE_FK i
                     where i.ForeignKeyConstraintName=o.ForeignKeyConstraintName
                     and i.TableSchemaName=o.TableSchemaName
                     and i.ParentTableName=o.ParentTableName
                     and i.ReferenceTableName=o.ReferenceTableName
                     for xml path('')), 1, 1, '')+')'
                     AS CreateForeignKeyConstraintScript,
                     ParentTableName,
                     ReferenceTableName,
                     ForeignKeyConstraintName
                     from CTE_FK o
                     group by 
                     tableSchemaName,
                     ParentTableName,
                     ReferenceTableName,
                     ForeignKeyConstraintName
     
     
     
    SQLServerデータベースで外部キー制約を再作成するためのスクリプトを生成する方法
     CreateForeignKeyConstraintScript列から結果を取得します。本番環境で実行する前に、まずDEVまたはQAでスクリプトを実行して、すべてが正常に機能することを確認することをお勧めします。



    ビデオデモ:生成の作成方法SQLServerで外部キー制約を再作成するためのスクリプト

    1. MYSQLのLIKEと=の違いは?

    2. コミットと選択の間のOracleの遅れ

    3. PostgreSQLデータソースをWildFly9.0に追加するにはどうすればよいですか?

    4. Max()関数を使用してグループ値を選択する