복붙노트

[SQL] SQL 스크립트 DELETE CASCADE ON 추가하는 모든 외부 키를 변경하려면

SQL

SQL 스크립트 DELETE CASCADE ON 추가하는 모든 외부 키를 변경하려면

나는 약 250 테이블과 SQL 2005 데이터베이스가 있습니다.

나는 일시적 그래서 대량 쉽게 제거 할 수있는 외부 키의 모든 DELETE CASCADE ON 사용하려는.

나는 모든 외래 키에 DELETE CASCADE ON 해제합니다.

나는이 일을 알고있는 유일한 방법은, 다음 몇 가지 더 검색 할 수 및 추가 교체, 스크립트 저장, 모든하지만 외부 키를 제거하기 위해서, 전체 데이터베이스 스크립트를 생성 생성 Management Studio를 사용하여 검색의 일종을하고 교체하는 것입니다 를 ON DELETE CASCADE.

그럼, 스크립트를 실행 내 삭제를 수행 한 후 다른 스크립트를 실행합니다.

이 스크립트를 생성하는 쉬운 방법이 있나요? 이 방법은 오류로 너무 경향이 보인다 나는 우리가 데이터베이스 나에 대한 모든 다른 변경과 날짜로 스크립트를 주기적으로 업데이트해야합니다 수동으로 내가 그것을 사용해야 할 수 있습니다 때마다 그것을 다시 생성합니다.

A가에 대한 시스템 테이블에서 선택 실행할 수있는 다른 옵션은 나를 위해 스크립트를 "생성"인가? 심지어 DELETE CASCADE ON 활성화하고 비활성화 시스템 테이블에 업데이트를 실행하는 것이 가능할 수 있을까?

해결법

  1. ==============================

    1.여기에 비슷한 목적으로 사용되는 스크립트 I입니다. 그것은 (. 두 개 이상의 필드를 사용) 복합 외래 키를 지원하지 않습니다 그리고 그것은 상황에 작동하기 전에 아마 일부 조정을해야합니다. 편집 : 특히 올바르게 다중 열 외래 키를 처리하지 않습니다.

    여기에 비슷한 목적으로 사용되는 스크립트 I입니다. 그것은 (. 두 개 이상의 필드를 사용) 복합 외래 키를 지원하지 않습니다 그리고 그것은 상황에 작동하기 전에 아마 일부 조정을해야합니다. 편집 : 특히 올바르게 다중 열 외래 키를 처리하지 않습니다.

    select
      DropStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema + 
          '].[' + ForeignKeys.ForeignTableName + 
          '] DROP CONSTRAINT [' + ForeignKeys.ForeignKeyName + ']; '
    ,  CreateStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema + 
          '].[' + ForeignKeys.ForeignTableName + 
          '] WITH CHECK ADD CONSTRAINT [' +  ForeignKeys.ForeignKeyName + 
          '] FOREIGN KEY([' + ForeignKeys.ForeignTableColumn + 
          ']) REFERENCES [' + schema_name(sys.objects.schema_id) + '].[' +
      sys.objects.[name] + ']([' +
      sys.columns.[name] + ']) ON DELETE CASCADE; '
     from sys.objects
      inner join sys.columns
        on (sys.columns.[object_id] = sys.objects.[object_id])
      inner join (
        select sys.foreign_keys.[name] as ForeignKeyName
         ,schema_name(sys.objects.schema_id) as ForeignTableSchema
         ,sys.objects.[name] as ForeignTableName
         ,sys.columns.[name]  as ForeignTableColumn
         ,sys.foreign_keys.referenced_object_id as referenced_object_id
         ,sys.foreign_key_columns.referenced_column_id as referenced_column_id
         from sys.foreign_keys
          inner join sys.foreign_key_columns
            on (sys.foreign_key_columns.constraint_object_id
              = sys.foreign_keys.[object_id])
          inner join sys.objects
            on (sys.objects.[object_id]
              = sys.foreign_keys.parent_object_id)
            inner join sys.columns
              on (sys.columns.[object_id]
                = sys.objects.[object_id])
               and (sys.columns.column_id
                = sys.foreign_key_columns.parent_column_id)
        ) ForeignKeys
        on (ForeignKeys.referenced_object_id = sys.objects.[object_id])
         and (ForeignKeys.referenced_column_id = sys.columns.column_id)
     where (sys.objects.[type] = 'U')
      and (sys.objects.[name] not in ('sysdiagrams'))
    
  2. ==============================

    2.위의 Andomar의 대답은 단일 열 외래 키 제약 조건 만 좋은하지만 작품이다. 나는 그것을 다중 열 제약 조건에 대한 약간의 적응 :

    위의 Andomar의 대답은 단일 열 외래 키 제약 조건 만 좋은하지만 작품이다. 나는 그것을 다중 열 제약 조건에 대한 약간의 적응 :

    create function dbo.fk_columns (@constraint_object_id int)
    returns varchar(255)
    as begin
    declare @r varchar(255)
    select @r = coalesce(@r + ',', '') + c.name
    from sys.foreign_key_columns fkc
    join sys.columns c
      on  fkc.parent_object_id = c.object_id
      and fkc.parent_column_id = c.column_id
    where fkc.constraint_object_id = @constraint_object_id
    return @r
    end
    
    select distinct
      DropStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema +
          '].[' + ForeignKeys.ForeignTableName +
          '] DROP CONSTRAINT [' + ForeignKeys.ForeignKeyName + '] '
    ,  CreateStmt = 'ALTER TABLE [' + ForeignKeys.ForeignTableSchema +
      '].[' + ForeignKeys.ForeignTableName +
      '] WITH CHECK ADD CONSTRAINT [' +  ForeignKeys.ForeignKeyName +
      '] FOREIGN KEY(' + dbo.fk_columns(constraint_object_id) + ')' +
      'REFERENCES [' + schema_name(sys.objects.schema_id) + '].[' +
      sys.objects.[name] + '] '
      + ' ON DELETE CASCADE'
     from sys.objects
      inner join sys.columns
        on (sys.columns.[object_id] = sys.objects.[object_id])
      inner join (
    select sys.foreign_keys.[name] as ForeignKeyName
     ,schema_name(sys.objects.schema_id) as ForeignTableSchema
     ,sys.objects.[name] as ForeignTableName
     ,sys.columns.[name]  as ForeignTableColumn
     ,sys.foreign_keys.referenced_object_id as referenced_object_id
     ,sys.foreign_key_columns.referenced_column_id as referenced_column_id
     ,sys.foreign_keys.object_id as constraint_object_id
     from sys.foreign_keys
      inner join sys.foreign_key_columns
        on (sys.foreign_key_columns.constraint_object_id
          = sys.foreign_keys.[object_id])
      inner join sys.objects
        on (sys.objects.[object_id]
          = sys.foreign_keys.parent_object_id)
        inner join sys.columns
          on (sys.columns.[object_id]
            = sys.objects.[object_id])
           and (sys.columns.column_id
            = sys.foreign_key_columns.parent_column_id)
    -- Uncomment this if you want to include only FKs that already
    -- have a cascade constraint.
    --       where (delete_referential_action_desc = 'CASCADE' or update_referential_action_desc = 'CASCADE')
    ) ForeignKeys
    on (ForeignKeys.referenced_object_id = sys.objects.[object_id])
     and (ForeignKeys.referenced_column_id = sys.columns.column_id)
     where (sys.objects.[type] = 'U')
      and (sys.objects.[name] not in ('sysdiagrams'))
    

    또한 현재 그것을 가지고 FKS에서 DELETE CASCADE ON 도움말 제거하려면 쿼리를 사용할 수 있습니다.

    이 아직은 열이 두 테이블에서 여러 가지 명명 된 사건을 처리하지 않습니다 - 다른 사용자 정의 함수는 정의 할 필요가있다.

  3. ==============================

    3.더 많은 표준을 준수 솔루션 :

    더 많은 표준을 준수 솔루션 :

    ;WITH CTE AS 
    (
        SELECT  
             KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
            ,KCU1.TABLE_SCHEMA AS FK_SCHEMA_NAME 
            ,KCU1.TABLE_NAME AS FK_TABLE_NAME 
            ,KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
            ,KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION 
            ,KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
            ,KCU2.TABLE_SCHEMA AS REFERENCED_SCHEMA_NAME 
            ,KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME 
            ,KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
            ,KCU2.ORDINAL_POSITION AS REFERENCED_ORDINAL_POSITION 
        FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 
            ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
            AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
            AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 
            ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG  
            AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA 
            AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME 
            AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 
    )
    
    
    SELECT 
         FK_CONSTRAINT_NAME
        --,FK_SCHEMA_NAME
        --,FK_TABLE_NAME
        --,FK_COLUMN_NAME
        --,FK_ORDINAL_POSITION
        --,REFERENCED_CONSTRAINT_NAME
        --,REFERENCED_SCHEMA_NAME
        --,REFERENCED_TABLE_NAME
        --,REFERENCED_COLUMN_NAME
        --,REFERENCED_ORDINAL_POSITION
    
        ,
            'ALTER TABLE [' + FK_SCHEMA_NAME + ']' 
            + '.[' + FK_TABLE_NAME + '] ' 
            + 'DROP CONSTRAINT [' + FK_CONSTRAINT_NAME + ']; ' 
        AS DropStmt 
    
        ,
        'ALTER TABLE [' + FK_SCHEMA_NAME + ']' 
            + '.[' + FK_TABLE_NAME + '] ' + 
            + 'WITH CHECK ADD CONSTRAINT [' +  FK_CONSTRAINT_NAME + '] ' 
            + 'FOREIGN KEY([' + FK_COLUMN_NAME + ']) ' 
            + 'REFERENCES [' + REFERENCED_SCHEMA_NAME + '].[' + REFERENCED_TABLE_NAME + ']([' + REFERENCED_COLUMN_NAME + ']) ON DELETE CASCADE; ' 
        AS CreateStmt 
    
    FROM CTE 
    
    WHERE (1=1) 
    /*
    AND FK_TABLE_NAME IN 
    (
         'T_SYS_Geschossrechte'
        ,'T_SYS_Gebaeuderechte'
        ,'T_SYS_Standortrechte'
    )
    
    AND REFERENCED_TABLE_NAME NOT LIKE 'T_AP_Ref_Mandant'
    */
    
    ORDER BY  
         FK_TABLE_NAME
        ,FK_CONSTRAINT_NAME
        ,FK_COLUMN_NAME
        ,FK_ORDINAL_POSITION
        ,REFERENCED_CONSTRAINT_NAME
        ,REFERENCED_TABLE_NAME
        ,REFERENCED_COLUMN_NAME
        ,REFERENCED_ORDINAL_POSITION
    

    편집하다: 다중 열 외래 키의 확장 :

    ;WITH CTE AS 
    ( 
      SELECT  
             KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
            ,KCU1.TABLE_SCHEMA AS FK_SCHEMA_NAME 
            ,KCU1.TABLE_NAME AS FK_TABLE_NAME 
            ,KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
            ,KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION 
            ,KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
            ,KCU2.TABLE_SCHEMA AS REFERENCED_SCHEMA_NAME 
            ,KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME 
            ,KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
            ,KCU2.ORDINAL_POSITION AS REFERENCED_ORDINAL_POSITION 
        FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 
            ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
            AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
            AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 
            ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG  
            AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA 
            AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME 
            AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 
    )
    SELECT 
         FK_SCHEMA_NAME
        ,FK_TABLE_NAME
        ,FK_CONSTRAINT_NAME 
        --,FK_COLUMN_NAME
        --,REFERENCED_COLUMN_NAME
    
    
    
        ,
        'ALTER TABLE ' + QUOTENAME(FK_SCHEMA_NAME) + '.' + QUOTENAME(FK_TABLE_NAME) + ' ' 
          + 'DROP CONSTRAINT ' + QUOTENAME(FK_CONSTRAINT_NAME) + '; ' 
        AS DropStmt 
    
        ,
        'ALTER TABLE ' + QUOTENAME(FK_SCHEMA_NAME) + '.' + QUOTENAME(FK_TABLE_NAME) + ' 
        ADD CONSTRAINT ' + QUOTENAME(FK_CONSTRAINT_NAME) + ' 
        FOREIGN KEY('
        + 
            SUBSTRING 
            ( 
                (
                    SELECT ', ' + QUOTENAME(FK.FK_COLUMN_NAME) AS [text()] 
                    FROM CTE AS FK 
                    WHERE FK.FK_CONSTRAINT_NAME = CTE.FK_CONSTRAINT_NAME
                    AND FK.FK_SCHEMA_NAME = CTE.FK_SCHEMA_NAME
                    AND FK.FK_TABLE_NAME = CTE.FK_TABLE_NAME 
                    ORDER BY FK.FK_ORDINAL_POSITION
                    FOR XML PATH, TYPE 
                ).value('.[1]', 'nvarchar(MAX)')
                ,3, 4000
            ) 
        + ') 
    '
        + '    REFERENCES ' + QUOTENAME(REFERENCED_SCHEMA_NAME) + '.' + QUOTENAME(REFERENCED_TABLE_NAME) + '(' 
        + SUBSTRING 
          ( 
              (
                  SELECT ', ' + QUOTENAME(Referenced.REFERENCED_COLUMN_NAME) AS [text()] 
                  FROM CTE AS Referenced 
                  WHERE Referenced.FK_CONSTRAINT_NAME = CTE.FK_CONSTRAINT_NAME
                  AND Referenced.REFERENCED_SCHEMA_NAME = CTE.REFERENCED_SCHEMA_NAME
                  AND Referenced.REFERENCED_TABLE_NAME = CTE.REFERENCED_TABLE_NAME
                  ORDER BY Referenced.REFERENCED_ORDINAL_POSITION 
                  FOR XML PATH, TYPE 
              ).value('.[1]', 'nvarchar(MAX)')
              , 3, 4000 
          )
        + ') 
        ON DELETE CASCADE 
    ; ' AS CreateStmt 
    
    FROM CTE 
    
    GROUP BY 
         FK_SCHEMA_NAME
        ,FK_TABLE_NAME
        ,FK_CONSTRAINT_NAME 
    
        ,REFERENCED_SCHEMA_NAME
        ,REFERENCED_TABLE_NAME
    

    과 PostgreSQL에 대한 훨씬 간단 버전 :

    ;WITH CTE AS 
    ( 
      SELECT  
             KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
            ,KCU1.TABLE_SCHEMA AS FK_SCHEMA_NAME 
            ,KCU1.TABLE_NAME AS FK_TABLE_NAME 
            ,KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
            ,KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION 
            ,KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
            ,KCU2.TABLE_SCHEMA AS REFERENCED_SCHEMA_NAME 
            ,KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME 
            ,KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
            ,KCU2.ORDINAL_POSITION AS REFERENCED_ORDINAL_POSITION 
        FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 
            ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG  
            AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
            AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 
    
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 
            ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG  
            AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA 
            AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME 
            AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 
    )
    SELECT 
         FK_SCHEMA_NAME
        ,FK_TABLE_NAME
        ,FK_CONSTRAINT_NAME 
        --,FK_COLUMN_NAME
        --,REFERENCED_COLUMN_NAME
    
    
    
        ,
        'ALTER TABLE ' || QUOTE_IDENT(FK_SCHEMA_NAME) || '.' || QUOTE_IDENT(FK_TABLE_NAME) || ' ' 
          || 'DROP CONSTRAINT ' || QUOTE_IDENT(FK_CONSTRAINT_NAME) || '; ' 
        AS DropStmt 
    
        ,
        'ALTER TABLE ' || QUOTE_IDENT(FK_SCHEMA_NAME) || '.' || QUOTE_IDENT(FK_TABLE_NAME) || ' 
        ADD CONSTRAINT ' || QUOTE_IDENT(FK_CONSTRAINT_NAME) || ' 
        FOREIGN KEY(' || string_agg(FK_COLUMN_NAME, ', ') || ') 
    '
        || '    REFERENCES ' || QUOTE_IDENT(REFERENCED_SCHEMA_NAME) || '.' || QUOTE_IDENT(REFERENCED_TABLE_NAME) || '(' || string_agg(REFERENCED_COLUMN_NAME, ', ') || ') 
        ON DELETE CASCADE 
    ; ' AS CreateStmt 
    
    FROM CTE 
    
    GROUP BY 
         FK_SCHEMA_NAME
        ,FK_TABLE_NAME
        ,FK_CONSTRAINT_NAME 
    
        ,REFERENCED_SCHEMA_NAME
        ,REFERENCED_TABLE_NAME
    
  4. ==============================

    4.당신은 테이블을 변경 FK 제약 조건을 삭제하고이를 다시해야합니다 :

    당신은 테이블을 변경 FK 제약 조건을 삭제하고이를 다시해야합니다 :

    이는 DB2 구문입니다. SQLServer에이 유사해야

    ALTER TABLE emp DROP CONSTRAINT fk_dept;
    
    ALTER TABLE emp ADD CONSTRAINT fk_dept
    FOREIGN KEY(dept_no)
    REFERENCES dept(deptno)
    ON DELETE CASCADE;
    

    당신은 모든 외부 키에 대한 시스템 테이블을 쿼리를 삭제하고 다시 작성하기 위해 자신의 SP를 작성할 수 있습니다. 당신은 당신이 FK defn이를 통해 루프, CASCADE를 포함하는 VARCHAR 및 APPEND / 편집에 넣어 다음 stmt를 실행할 수있는이 작업을 수행하기 위해 SP에서 동적 SQL을 사용해야합니다.

  5. ==============================

    5.@Andomar의 대답은 나를 위해 일하지만 조금 설명서이었다 - 당신은 결과를 복사하여 실행 한 후, 그것을 실행해야합니다. 나는 나의 자동화 된 테스트 설정의 일부로 그래서 자동으로 하나 개의 쿼리에서 실행하는 데 필요에 따라이를 사용하는 데 필요한.

    @Andomar의 대답은 나를 위해 일하지만 조금 설명서이었다 - 당신은 결과를 복사하여 실행 한 후, 그것을 실행해야합니다. 나는 나의 자동화 된 테스트 설정의 일부로 그래서 자동으로 하나 개의 쿼리에서 실행하는 데 필요에 따라이를 사용하는 데 필요한.

    나는 외래 키 제약 조건을 수정하기 위해 실행하는 모든 SQL을 가져옵니다 다음에 올이 후 실제로 한 번에 모든 것을 실행합니다 :

        IF Object_id('tempdb..#queriesForContraints') IS NOT NULL 
          BEGIN 
              DROP TABLE #queriesForContraints
          END 
    
        DECLARE @ignoreTablesCommaSeparated VARCHAR(1000)
    
        SELECT 'ALTER TABLE [' 
               + ForeignKeys.foreigntableschema + '].[' 
               + ForeignKeys.foreigntablename 
               + '] DROP CONSTRAINT [' 
               + ForeignKeys.foreignkeyname + ']; ' 
               + 'ALTER TABLE [' 
               + ForeignKeys.foreigntableschema + '].[' 
               + ForeignKeys.foreigntablename 
               + '] WITH CHECK ADD CONSTRAINT [' 
               + ForeignKeys.foreignkeyname 
               + '] FOREIGN KEY([' 
               + ForeignKeys.foreigntablecolumn 
               + ']) REFERENCES [' 
               + Schema_name(sys.objects.schema_id) + '].[' 
               + sys.objects.[name] + ']([' 
               + sys.columns.[name] 
               + ']) ON DELETE CASCADE; ' AS query
        INTO #queriesForContraints
        FROM   sys.objects 
               INNER JOIN sys.columns 
                       ON ( sys.columns.[object_id] = sys.objects.[object_id] ) 
               INNER JOIN (SELECT sys.foreign_keys.[name]                      AS 
                                  ForeignKeyName, 
                                  Schema_name(sys.objects.schema_id)           AS 
                      ForeignTableSchema, 
                                  sys.objects.[name]                           AS 
                      ForeignTableName, 
                                  sys.columns.[name]                           AS 
                      ForeignTableColumn, 
                                  sys.foreign_keys.referenced_object_id        AS 
                      referenced_object_id, 
                                  sys.foreign_key_columns.referenced_column_id AS 
                      referenced_column_id 
                           FROM   sys.foreign_keys 
                                  INNER JOIN sys.foreign_key_columns 
                                          ON ( 
                                  sys.foreign_key_columns.constraint_object_id = 
                                  sys.foreign_keys.[object_id] ) 
                                  INNER JOIN sys.objects 
                                          ON ( sys.objects.[object_id] = 
                                             sys.foreign_keys.parent_object_id ) 
                                  INNER JOIN sys.columns 
                                          ON ( sys.columns.[object_id] = 
                                               sys.objects.[object_id] ) 
                                             AND ( sys.columns.column_id = 
        sys.foreign_key_columns.parent_column_id )) 
        ForeignKeys 
        ON ( ForeignKeys.referenced_object_id = sys.objects.[object_id] ) 
        AND ( ForeignKeys.referenced_column_id = sys.columns.column_id ) 
        WHERE  ( sys.objects.[type] = 'U' ) 
               AND ( sys.objects.[name] NOT IN ( 
                    'sysdiagrams' --add more comma separated table names here if required
                ) ) 
    
        DECLARE @queryToRun NVARCHAR(MAX)
    
        SELECT  @queryToRun = STUFF(
                (SELECT query + ''
                 FROM #queriesForContraints
                 FOR XML PATH (''))
             , 1, 0, '')
    
        EXEC sp_executesql @statement = @queryToRun
    
        IF Object_id('tempdb..#queriesForContraints') IS NOT NULL 
          BEGIN 
              DROP TABLE #queriesForContraints
          END 
    
  6. ==============================

    6.유일한 매개 변수는 프로세스 테이블의 이름 인 새 저장 프로 시저를합니다. sys.foreign_keys 및 sys.foreign_key_columns 적절한 드롭을 구축하고 구문을 만들고, 단지 커서 일부 인쇄 (KISS)를 사용하는 동안이 절차에서는 루프가 필요합니다.

    유일한 매개 변수는 프로세스 테이블의 이름 인 새 저장 프로 시저를합니다. sys.foreign_keys 및 sys.foreign_key_columns 적절한 드롭을 구축하고 구문을 만들고, 단지 커서 일부 인쇄 (KISS)를 사용하는 동안이 절차에서는 루프가 필요합니다.

    구문이 프로 시저를 호출 :

    EXEC sp_msforeachtable 'YourProcedureName ''?'''
    

    그리고 각 테이블에 대해 실행됩니다. 가지고 출력을 실행하면 모든 작업이 완료된다.

  7. ==============================

    7.내가 찾은 간단한 솔루션은 CASCADE에 모든 NO ACTION을 대체하기 위해 검색 기능을 사용하여 하나의 파일로 데이터베이스를 내보낼 데이터베이스를 삭제하고 편집 된 파일을 가져 오는 것입니다.

    내가 찾은 간단한 솔루션은 CASCADE에 모든 NO ACTION을 대체하기 위해 검색 기능을 사용하여 하나의 파일로 데이터베이스를 내보낼 데이터베이스를 삭제하고 편집 된 파일을 가져 오는 것입니다.

    수출과 수입 사이의 데이터베이스에 변경 정보가 손실됩니다.

  8. from https://stackoverflow.com/questions/868620/sql-script-to-alter-all-foreign-keys-to-add-on-delete-cascade by cc-by-sa and MIT license