Skip to content

Instantly share code, notes, and snippets.

@IndifferentDisdain
Created August 30, 2017 17:50
Show Gist options
  • Save IndifferentDisdain/02e897c1f64032eda8f15e542395b75a to your computer and use it in GitHub Desktop.
Save IndifferentDisdain/02e897c1f64032eda8f15e542395b75a to your computer and use it in GitHub Desktop.
Dynamically drop and re-create foreign keys in SQL Server
/*
This script will load all foreign keys associated to a particular primary key, drop them (to allow you to do some work that
would violate primary keys), then re-add them. In our example, we're removing all foreign keys to a Products table, then re-creating them.
Inspired by https://stackoverflow.com/questions/925738/how-to-find-foreign-key-dependencies-in-sql-server
*/
DECLARE @tblProductFKs TABLE (FK_TABLE VARCHAR(100), FK_COLUMN VARCHAR(100), PK_TABLE VARCHAR(100), PK_COLUMN VARCHAR(100), Constraint_Name VARCHAR(100))
INSERT INTO @tblProductFKs
SELECT
FK_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
WHERE PK.TABLE_NAME = 'Products'
DECLARE @fk_table VARCHAR(100), @fk_column VARCHAR(100), @pk_table VARCHAR(100), @pk_column VARCHAR(100), @constraint_name VARCHAR(100), @sql VARCHAR(MAX)
DECLARE fk_cursor CURSOR FOR (SELECT * FROM @tblProductFKs)
OPEN fk_cursor
FETCH NEXT FROM fk_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column, @constraint_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER TABLE ' + @fk_table + ' DROP CONSTRAINT ' + @constraint_name
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM fk_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column, @constraint_name
END
CLOSE fk_cursor
-- do some work
OPEN fk_cursor
FETCH NEXT FROM fk_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column, @constraint_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'ALTER TABLE ' + @fk_table + ' ADD CONSTRAINT ' + @constraint_name + ' FOREIGN KEY (' + @fk_column + ') REFERENCES ' + @pk_table + ' (' + @pk_column + ')'
PRINT @sql
EXEC(@sql)
FETCH NEXT FROM fk_cursor INTO @fk_table, @fk_column, @pk_table, @pk_column, @constraint_name
END
CLOSE fk_cursor
DEALLOCATE fk_cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment