Loading 1MD3Objects/Procedures/MD3.CreateColumn.sql +1 −15 Original line number Diff line number Diff line Loading @@ -75,21 +75,7 @@ BEGIN PRINT 'that are also being dropped. You will need to manually remove those' 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 --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; EXEC MD3.DropReferencingFKs @TableName, @SchemaName ,@ColumnName; --remove any UNIQUE constraints EXEC MD3.RemoveUniqueConstraints Loading 1MD3Objects/Procedures/MD3.DropReferencingFKs.sql 0 → 100644 +63 −0 Original line number 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 Loading
1MD3Objects/Procedures/MD3.CreateColumn.sql +1 −15 Original line number Diff line number Diff line Loading @@ -75,21 +75,7 @@ BEGIN PRINT 'that are also being dropped. You will need to manually remove those' 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 --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; EXEC MD3.DropReferencingFKs @TableName, @SchemaName ,@ColumnName; --remove any UNIQUE constraints EXEC MD3.RemoveUniqueConstraints Loading
1MD3Objects/Procedures/MD3.DropReferencingFKs.sql 0 → 100644 +63 −0 Original line number 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