Commit 8c923624 authored by CarpathiaLaptop's avatar CarpathiaLaptop
Browse files

added MD3.DropReferencingFKs.sql that drop FKs from other tables so a table...

added MD3.DropReferencingFKs.sql that drop FKs from other tables so a table can either be dropped or its PK changed
parent c6e995a1
Loading
Loading
Loading
Loading
+1 −15
Original line number Original line Diff line number Diff line
@@ -75,21 +75,7 @@ BEGIN
			PRINT 'that are also being dropped.  You will need to manually remove those'
			PRINT 'that are also being dropped.  You will need to manually remove those'
			PRINT 'as well from the MD3 files.'
			PRINT 'as well from the MD3 files.'


			--look for FKs that REFERENCE the col being removed, or where an FK is bound to the column
			EXEC MD3.DropReferencingFKs @TableName, @SchemaName ,@ColumnName;
			--this needs work.  
			IF EXISTS (
				SELECT Const.*
				FROM sys.objects o
				CROSS APPLY MD3.f_GetForeignKeys (SCHEMA_NAME(o.schema_id),o.Name) Const
				WHERE Const.ParentKeyColumns LIKE '%' + @ColumnName + '%'
				OR Const.KeyColumns LIKE '%' + @ColumnName + '%'
			)
			BEGIN
				PRINT 'Stubbed.'
				PRINT 'We need to make a call to MD3.CreateForeignKey with the DropFK option here.'
				RAISERROR ('An error occurred, please see MD3.CreateColumn',16,1) 
			END;
            


            --remove any UNIQUE constraints
            --remove any UNIQUE constraints
            EXEC MD3.RemoveUniqueConstraints
            EXEC MD3.RemoveUniqueConstraints
+63 −0
Original line number Original line Diff line number Diff line
if exists (select * from sysobjects where type = 'P' and id = object_id('MD3.DropReferencingFKs'))
begin
	drop proc MD3.DropReferencingFKs
end 
go
CREATE PROC MD3.DropReferencingFKs
(
	@tablename sysname
	,@schemaName SYSNAME
	,@ColumnName	SYSNAME
)
AS

/*
	drops all FKs that REFERENCE the given table/col.  

	Why is this needed?  
	-------------------
	This is handy when you need to drop a table or a column and need to rid yourself of the referencing objects

	MD3 will automatically recreate any FKs during 9ForeignKeys processing


*/
BEGIN
SET NOCOUNT ON  

DECLARE @cmd NVARCHAR(1000) , @FK_NAME varchar(200), @sch varchar(200),@tbl VARCHAR(200);

		
			DECLARE RemoveReferencingKeys CURSOR FOR

				SELECT ForeignKeyName, SchemaName, TableName
				FROM sys.objects o
				CROSS APPLY MD3.f_GetForeignKeys (SCHEMA_NAME(o.schema_id),o.Name) Const
				WHERE Const.ParentKeyColumns LIKE '%' + @ColumnName + '%'
				OR Const.KeyColumns LIKE '%' + @ColumnName + '%'
				AND o.schema_id = SCHEMA_ID(@schemaName) AND o.object_id = OBJECT_ID(@tablename);
			OPEN RemoveReferencingKeys
			FETCH NEXT FROM RemoveReferencingKeys INTO @FK_NAME, @sch,@tbl
			WHILE (@@fetch_status = 0)
			BEGIN
				SELECT  @FK_NAME,@sch,@tbl
				EXEC MD3.CreateForeignKey
				  @SchemaName		= @sch
				 ,@TableName		= @tbl
				 --,@KeyColumns		VARCHAR(MAX) = NULL -- comma-separated list of key columns
				 ,@ForeignKeyName	= @FK_NAME		 
				 --,@ParentSchemaName SYSNAME		= NULL
				 --,@ParentTableName	SYSNAME		= NULL
				 --,@ParentKeyColumns	VARCHAR(MAX) = NULL -- comma-separated list of parent table key columns
				 --,@IsDelCascade		BIT = 0      -- default is 0 (NO ACTION on delete) or 1 for CASCADE delete to turn on
				 --,@IsUpdCascade		BIT = 0      -- default is 0 (NO ACTION on update) or 1 for CASCADE update to turn on
				 --,@AllowNoCheck		BIT = 0      -- Allow NOCHECK (ie, existing data may violate FK constraint)
				 ,@DropFK			= 1		 -- drop the FK based on name, do no other checking.   	
				;
				FETCH NEXT FROM RemoveReferencingKeys INTO @FK_NAME, @sch,@tbl;
			END;
			CLOSE RemoveReferencingKeys;
			DEALLOCATE RemoveReferencingKeys;

END;
GO
 No newline at end of file