Created
August 30, 2017 17:50
-
-
Save IndifferentDisdain/02e897c1f64032eda8f15e542395b75a to your computer and use it in GitHub Desktop.
Dynamically drop and re-create foreign keys in SQL Server
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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