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

后端 未结 16 2186
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:33

    I have a more useful version if you are interested. I lifted a bit of code from here a website where the link is no longer active. I modifyied it to allow for an array of tables into the stored procedure and it populates the drop, truncate, add statements before executing all of them. This gives you control to decide which tables need truncating.

    /****** Object:  UserDefinedTableType [util].[typ_objects_for_managing]    Script Date: 03/04/2016 16:42:55 ******/
    CREATE TYPE [util].[typ_objects_for_managing] AS TABLE(
        [schema] [sysname] NOT NULL,
        [object] [sysname] NOT NULL
    )
    GO
    
    create procedure [util].[truncate_table_with_constraints]
    @objects_for_managing util.typ_objects_for_managing readonly
    
    --@schema sysname
    --,@table sysname
    
    as 
    --select
    --    @table = 'TABLE',
    --    @schema = 'SCHEMA'
    
    declare @exec_table as table (ordinal int identity (1,1), statement nvarchar(4000), primary key (ordinal));
    
    --print '/*Drop Foreign Key Statements for ['+@schema+'].['+@table+']*/'
    
    insert into @exec_table (statement)
    select
              'ALTER TABLE ['+SCHEMA_NAME(o.schema_id)+'].['+ o.name+'] DROP CONSTRAINT ['+fk.name+']'
    from sys.foreign_keys fk
    inner join sys.objects o
              on fk.parent_object_id = o.object_id
    where 
    exists ( 
    select * from @objects_for_managing chk 
    where 
    chk.[schema] = SCHEMA_NAME(o.schema_id)  
    and 
    chk.[object] = o.name
    ) 
    ;
              --o.name = @table and
              --SCHEMA_NAME(o.schema_id)  = @schema
    
    insert into @exec_table (statement) 
    select
    'TRUNCATE TABLE ' + src.[schema] + '.' + src.[object] 
    from @objects_for_managing src
    ; 
    
    --print '/*Create Foreign Key Statements for ['+@schema+'].['+@table+']*/'
    insert into @exec_table (statement)
    select 'ALTER TABLE ['+SCHEMA_NAME(o.schema_id)+'].['+o.name+'] ADD CONSTRAINT ['+fk.name+'] FOREIGN KEY (['+c.name+']) 
    REFERENCES ['+SCHEMA_NAME(refob.schema_id)+'].['+refob.name+'](['+refcol.name+'])'
    from sys.foreign_key_columns fkc
    inner join sys.foreign_keys fk
              on fkc.constraint_object_id = fk.object_id
    inner join sys.objects o
              on fk.parent_object_id = o.object_id
    inner join sys.columns c
              on      fkc.parent_column_id = c.column_id and
                       o.object_id = c.object_id
    inner join sys.objects refob
              on fkc.referenced_object_id = refob.object_id
    inner join sys.columns refcol
              on fkc.referenced_column_id = refcol.column_id and
                       fkc.referenced_object_id = refcol.object_id
    where 
    exists ( 
    select * from @objects_for_managing chk 
    where 
    chk.[schema] = SCHEMA_NAME(o.schema_id)  
    and 
    chk.[object] = o.name
    ) 
    ;
    
              --o.name = @table and
              --SCHEMA_NAME(o.schema_id)  = @schema
    
    
    
    declare @looper int , @total_records int, @sql_exec nvarchar(4000)
    
    select @looper = 1, @total_records = count(*) from @exec_table; 
    
    while @looper <= @total_records 
    begin
    
    select @sql_exec = (select statement from @exec_table where ordinal =@looper)
    exec sp_executesql @sql_exec 
    print @sql_exec 
    set @looper = @looper + 1
    end
    

提交回复
热议问题