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

すべてのテーブルのすべての外部キー制約を削除するにはどうすればよいですか?

    至る所に主題についての多くの情報があります。 この詳細な回答 を確認してください @AaronBertrandによる。外部キーを一時的に無効にすることについて説明していますが、すべてを読んで自由に変更すると、さまざまな操作を実行して多くのことを達成できる優れたスクリプトが得られます。

    私の側からは、すべての外部キーを取得するために2つの異なるスクリプトを提案できます。どちらの場合も、--EXEC (@SQL)のコメントを解除します ALTERを実行するには コード。または、すべてのalter句が出力されるまで待ってから、コピーして貼り付けて実行することもできます。

    最初のものはINFORMATION_SCHEMAを使用します 制約を取得するには:

    DECLARE @SQL VARCHAR(MAX)=''
    SELECT @SQL = @SQL + 'ALTER TABLE ' + QUOTENAME(FK.TABLE_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME) + ' DROP CONSTRAINT [' + RTRIM(C.CONSTRAINT_NAME) +'];' + CHAR(13)
    --SELECT K_Table = FK.TABLE_NAME, FK_Column = CU.COLUMN_NAME, PK_Table = PK.TABLE_NAME, PK_Column = PT.COLUMN_NAME, Constraint_Name = C.CONSTRAINT_NAME
      FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
     INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
     INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
     INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
        ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
     INNER JOIN (
                SELECT i1.TABLE_NAME, i2.COLUMN_NAME
                  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
                 INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
               ) PT
        ON PT.TABLE_NAME = PK.TABLE_NAME
    
    --EXEC (@SQL)
    
    PRINT @SQL
    

    これは、さまざまなシステムビューとCTEテーブルを使用しています。

    DECLARE @SQL varchar(4000)=''
    ;WITH ReferencingFK AS 
    (
        SELECT fk.Name AS 'FKName', OBJECT_NAME(fk.parent_object_id) 'ParentTable',
                cpa.name 'ParentColumnName', OBJECT_NAME(fk.referenced_object_id) 'ReferencedTable',
                cref.name 'ReferencedColumnName'
        FROM sys.foreign_keys fk
        INNER JOIN sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
        INNER JOIN sys.columns cpa ON fkc.parent_object_id = cpa.object_id AND fkc.parent_column_id = cpa.column_id
        INNER JOIN sys.columns cref ON fkc.referenced_object_id = cref.object_id AND fkc.referenced_column_id = cref.column_id
    )
    SELECT @SQL = @SQL + 'ALTER TABLE ' + ParentTable + ' DROP CONSTRAINT [' + RTRIM(FKName) +'];' + CHAR(13)
    --SELECT FKName, ParentTable, ParentColumnName, ReferencedTable, ReferencedColumnName
      FROM ReferencingFK
     WHERE ReferencedTable = 'Employee'
     ORDER BY ParentTable, ReferencedTable, FKName
    
    --EXEC (@SQL) 
    
    PRINT @SQL
    


    1. psycopg2を使用してPostgresのSQLLIKE値をエスケープします

    2. 変更またはドロップ時に起動するMySQLトリガー

    3. タイプ'Oracle.EntityFrameworkCore'の'メソッド'get_Info'を修正する方法には実装がありません。

    4. MySQL –接続エラー– [MySQL] [ODBC 5.3(w)ドライバー]ホスト「IP」はこのMySQLサーバーへの接続を許可されていません