How can foreign key constraints be temporarily disabled using T-SQL?

后端 未结 16 2164
Happy的楠姐
Happy的楠姐 2020-11-22 04:57

Are disabling and enabling foreign key constraints supported in SQL Server? Or is my only option to drop and then re-create

16条回答
  •  醉梦人生
    2020-11-22 05:41

    SET NOCOUNT ON
    
    DECLARE @table TABLE(
       RowId INT PRIMARY KEY IDENTITY(1, 1),
       ForeignKeyConstraintName NVARCHAR(200),
       ForeignKeyConstraintTableSchema NVARCHAR(200),
       ForeignKeyConstraintTableName NVARCHAR(200),
       ForeignKeyConstraintColumnName NVARCHAR(200),
       PrimaryKeyConstraintName NVARCHAR(200),
       PrimaryKeyConstraintTableSchema NVARCHAR(200),
       PrimaryKeyConstraintTableName NVARCHAR(200),
       PrimaryKeyConstraintColumnName NVARCHAR(200),
       UpdateRule NVARCHAR(100),
       DeleteRule NVARCHAR(100)   
    )
    
    INSERT INTO @table(ForeignKeyConstraintName, ForeignKeyConstraintTableSchema, ForeignKeyConstraintTableName, ForeignKeyConstraintColumnName)
    SELECT 
       U.CONSTRAINT_NAME, 
       U.TABLE_SCHEMA, 
       U.TABLE_NAME, 
       U.COLUMN_NAME
    FROM 
       INFORMATION_SCHEMA.KEY_COLUMN_USAGE U
          INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C
             ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME
    WHERE
       C.CONSTRAINT_TYPE = 'FOREIGN KEY'
    
    UPDATE @table SET
       T.PrimaryKeyConstraintName = R.UNIQUE_CONSTRAINT_NAME,
       T.UpdateRule = R.UPDATE_RULE,
       T.DeleteRule = R.DELETE_RULE
    FROM 
       @table T
          INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS R
             ON T.ForeignKeyConstraintName = R.CONSTRAINT_NAME
    
    UPDATE @table SET
       PrimaryKeyConstraintTableSchema  = TABLE_SCHEMA,
       PrimaryKeyConstraintTableName  = TABLE_NAME
    FROM @table T
       INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS C
          ON T.PrimaryKeyConstraintName = C.CONSTRAINT_NAME
    
    UPDATE @table SET
       PrimaryKeyConstraintColumnName = COLUMN_NAME
    FROM @table T
       INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE U
          ON T.PrimaryKeyConstraintName = U.CONSTRAINT_NAME
    
    --SELECT * FROM @table
    
    SELECT '
    BEGIN TRANSACTION
    BEGIN TRY'
    
    --DROP CONSTRAINT:
    SELECT
       '
     ALTER TABLE [' + ForeignKeyConstraintTableSchema + '].[' + ForeignKeyConstraintTableName + '] 
     DROP CONSTRAINT ' + ForeignKeyConstraintName + '
       '
    FROM
       @table
    
    SELECT '
    END TRY
    
    BEGIN CATCH
       ROLLBACK TRANSACTION
       RAISERROR(''Operation failed.'', 16, 1)
    END CATCH
    
    IF(@@TRANCOUNT != 0)
    BEGIN
       COMMIT TRANSACTION
       RAISERROR(''Operation completed successfully.'', 10, 1)
    END
    '
    
    --ADD CONSTRAINT:
    SELECT '
    BEGIN TRANSACTION
    BEGIN TRY'
    
    SELECT
       '
       ALTER TABLE [' + ForeignKeyConstraintTableSchema + '].[' + ForeignKeyConstraintTableName + '] 
       ADD CONSTRAINT ' + ForeignKeyConstraintName + ' FOREIGN KEY(' + ForeignKeyConstraintColumnName + ') REFERENCES [' + PrimaryKeyConstraintTableSchema + '].[' + PrimaryKeyConstraintTableName + '](' + PrimaryKeyConstraintColumnName + ') ON UPDATE ' + UpdateRule + ' ON DELETE ' + DeleteRule + '
       '
    FROM
       @table
    
    SELECT '
    END TRY
    
    BEGIN CATCH
       ROLLBACK TRANSACTION
       RAISERROR(''Operation failed.'', 16, 1)
    END CATCH
    
    IF(@@TRANCOUNT != 0)
    BEGIN
       COMMIT TRANSACTION
       RAISERROR(''Operation completed successfully.'', 10, 1)
    END'
    
    GO
    

提交回复
热议问题