Technical Article

Generate all database foreign keys

,

This script will create another script that has all foreign key DDL that exists in a given database.   You only have to run this, and then select the results of this script and paste it into another query window, or if for some reason you have lost your DDL this will enable you to retrieve it.

declare @User     varchar(128)
declare @TabName  varchar(128)
declare @RefName  varchar(128)
declare @FKName   varchar(128)
declare @STMT     varchar(5000)


PRINT '/* Generated FK script written by Jake Massey' 
PRINT ' * Scripting took palce on ' + Cast(GetDate() as varchar(30))
PRINT ' */'

declare FKCur cursor for
  select fk.name, t.name, u.name
  from sysobjects fk inner join sysobjects t
    on fk.parent_obj = t.id
    inner join sysusers u 
    on u.uid = t.uid
  where t.type = 'U'
  and fk.type = 'F'
  and t.name <> 'dtproperties'

open FKCur 

fetch next from FKCur into @FKName, @TabName, @User

while @@FETCH_STATUS = 0
  begin
select @STMT = 
'ALTER TABLE [' + @User + '].[' + @TabName + '] ADD 
CONSTRAINT [' + @FKName + '] FOREIGN KEY
 ( 
'

------------------------------------------------------
declare @Col1  varchar(128)
declare @Col2  varchar(128)
declare @Col3  varchar(128)
declare @Col4  varchar(128)
declare @Col5  varchar(128)
declare @Col6  varchar(128)
declare @Col7  varchar(128)
declare @Col8  varchar(128)
declare @Col9  varchar(128)
declare @Col10 varchar(128)
declare @Col11 varchar(128)
declare @Col12 varchar(128)
declare @Col13 varchar(128)
declare @Col14 varchar(128)
declare @Col15 varchar(128)
declare @Col16 varchar(128)

declare @Ref1  varchar(128)
declare @Ref2  varchar(128)
declare @Ref3  varchar(128)
declare @Ref4  varchar(128)
declare @Ref5  varchar(128)
declare @Ref6  varchar(128)
declare @Ref7  varchar(128)
declare @Ref8  varchar(128)
declare @Ref9  varchar(128)
declare @Ref10 varchar(128)
declare @Ref11 varchar(128)
declare @Ref12 varchar(128)
declare @Ref13 varchar(128)
declare @Ref14 varchar(128)
declare @Ref15 varchar(128)
declare @Ref16 varchar(128)

declare @RefTable varchar(128)
declare @RefOwner varchar(128)

declare @Update varchar(128)
declare @Delete varchar(128)


declare ColCur cursor for
  select col_name( object_id( sof.name ), sr.fkey1 ), 
     col_name( object_id( sof.name ), sr.fkey2 ),
     col_name( object_id( sof.name ), sr.fkey3 ),
     col_name( object_id( sof.name ), sr.fkey4 ),
     col_name( object_id( sof.name ), sr.fkey5 ),
     col_name( object_id( sof.name ), sr.fkey6 ),
     col_name( object_id( sof.name ), sr.fkey7 ),
     col_name( object_id( sof.name ), sr.fkey8 ),
     col_name( object_id( sof.name ), sr.fkey9 ),
     col_name( object_id( sof.name ), sr.fkey10 ),
     col_name( object_id( sof.name ), sr.fkey11 ),
     col_name( object_id( sof.name ), sr.fkey12 ),
     col_name( object_id( sof.name ), sr.fkey13 ),
     col_name( object_id( sof.name ), sr.fkey14 ),
     col_name( object_id( sof.name ), sr.fkey15 ),
     col_name( object_id( sof.name ), sr.fkey16 ),
 ----------------------------------------------
     col_name( object_id( sor.name ), sr.rkey1 ), 
     col_name( object_id( sor.name ), sr.rkey2 ),
     col_name( object_id( sor.name ), sr.rkey3 ),
     col_name( object_id( sor.name ), sr.rkey4 ),
     col_name( object_id( sor.name ), sr.rkey5 ),
     col_name( object_id( sor.name ), sr.rkey6 ),
     col_name( object_id( sor.name ), sr.rkey7 ),
     col_name( object_id( sor.name ), sr.rkey8 ),
     col_name( object_id( sor.name ), sr.rkey9 ),
     col_name( object_id( sor.name ), sr.rkey10 ),
     col_name( object_id( sor.name ), sr.rkey11 ),
     col_name( object_id( sor.name ), sr.rkey12 ),
     col_name( object_id( sor.name ), sr.rkey13 ),
     col_name( object_id( sor.name ), sr.rkey14 ),
     col_name( object_id( sor.name ), sr.rkey15 ),
     col_name( object_id( sor.name ), sr.rkey16 ),
 sor.name, su.name,
 CASE WHEN (objectproperty(constid, 'CnstIsUpdateCascade') = 1)
   THEN 'ON UPDATE CASCADE' ELSE ' ' END,
 CASE WHEN (objectproperty(constid, 'CnstIsDeleteCascade') = 1)
   THEN 'ON DELETE CASCADE' ELSE ' ' END
  from sysreferences sr inner join sysobjects sof on 
sof.id = sr.fkeyid
  inner join sysobjects sor on 
sor.id = sr.rkeyid
  inner join sysusers su on sor.uid = su.uid
  where sr.constid = object_id(@FKName)

open ColCur
  
        fetch next from ColCur into @Col1 , @Col2 , @Col3 , @Col4 , @Col5 , @Col6 , @Col7 ,
@Col8 , @Col9 , @Col10, @Col11, @Col12, @Col13, @Col14,
@Col15, @Col16,
@Ref1 , @Ref2 , @Ref3 , @Ref4 , @Ref5 , @Ref6 , @Ref7 ,
@Ref8 , @Ref9 , @Ref10, @Ref11, @Ref12, @Ref13, @Ref14,
@Ref15, @Ref16,
@RefTable, @RefOwner,
@Update, @Delete
if @Col1 = NULL 
set @Col1 = ''
if @Col2 = NULL
set @Col2 = ''
if @Col3 = NULL
set @Col3 = ''
if @Col4 = NULL
set @Col4 = ''
if @Col5 = NULL
set @Col5 = ''
if @Col6 = NULL
set @Col6 = ''
if @Col7 = NULL
set @Col7 = ''
if @Col8 = NULL
set @Col8 = ''
if @Col9 = NULL
set @Col9 = ''
if @Col10 = NULL
set @Col10 = ''
if @Col11 = NULL
set @Col11 = ''
if @Col12 = NULL
set @Col12 = ''
if @Col13 = NULL
set @Col13 = ''
if @Col14 = NULL
set @Col14 = ''
if @Col15 = NULL
set @Col15 = ''
if @Col16 = NULL
set @Col16 = ''
------------------------------
if @Ref1 = NULL 
set @Ref1 = ''
if @Ref2 = NULL
set @Ref2 = ''
if @Ref3 = NULL
set @Ref3 = ''
if @Ref4 = NULL
set @Ref4 = ''
if @Ref5 = NULL
set @Ref5 = ''
if @Ref6 = NULL
set @Ref6 = ''
if @Ref7 = NULL
set @Ref7 = ''
if @Ref8 = NULL
set @Ref8 = ''
if @Ref9 = NULL
set @Ref9 = ''
if @Ref10 = NULL
set @Ref10 = ''
if @Ref11 = NULL
set @Ref11 = ''
if @Ref12 = NULL
set @Ref12 = ''
if @Ref13 = NULL
set @Ref13 = ''
if @Ref14 = NULL
set @Ref14 = ''
if @Ref15 = NULL
set @Ref15 = ''
if @Ref16 = NULL
set @Ref16 = ''
------------------------------
if @Col1 <> '' 
  begin
  set @STMT = @STMT + '  [' + @Col1 + ']' + Char(13)
 end
if @Col2 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col2 + ']' + Char(13)
 end
if @Col3 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col3 + ']' + Char(13)
 end
if @Col4 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col4 + ']' + Char(13)
 end
if @Col5 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col5 + ']' + Char(13)
 end
if @Col6 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col6 + ']' + Char(13)
 end
if @Col7 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col7 + ']' + Char(13)
 end
if @Col8 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col8 + ']' + Char(13)
 end
if @Col9 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col9 + ']' + Char(13)
 end
if @Col10 <> '' 
 begin
  set @STMT = @STMT + ', [' + @Col10 + ']' + Char(13)
 end
if @Col11 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col11 + ']' + Char(13)
 end
if @Col12 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col12 + ']' + Char(13)
 end
if @Col13 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col13 + ']' + Char(13)
 end
if @Col14 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col14 + ']' + Char(13)
 end
if @Col15 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col15 + ']' + Char(13)
 end
if @Col16 <> ''
 begin
  set @STMT = @STMT + ', [' + @Col16 + ']' + Char(13)
 end
---------------------------------------------------------------
set @STMT = @STMT + 
' )REFERENCES [' + @RefOwner + '].[' + @RefTable + '] ( 
'
---------------------------------------------------------------
if @Ref1 <> '' 
  begin
  set @STMT = @STMT + '  [' + @Ref1 + ']' + Char(13)
 end
if @Ref2 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref2 + ']' + Char(13)
 end
if @Ref3 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref3 + ']' + Char(13)
 end
if @Ref4 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref4 + ']' + Char(13)
 end
if @Ref5 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref5 + ']' + Char(13)
 end
if @Ref6 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref6 + ']' + Char(13)
 end
if @Ref7 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref7 + ']' + Char(13)
 end
if @Ref8 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref8 + ']' + Char(13)
 end
if @Ref9 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref9 + ']' + Char(13)
 end
if @Ref10 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref10 + ']' + Char(13)
 end
if @Ref11 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref11 + ']' + Char(13)
 end
if @Ref12 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref12 + ']' + Char(13)
 end
if @Ref13 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref13 + ']' + Char(13)
 end
if @Ref14 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref14 + ']' + Char(13)
 end
if @Ref15 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref15 + ']' + Char(13)
 end
if @Ref16 <> ''
 begin
  set @STMT = @STMT + ', [' + @Ref16 + ']' + Char(13)
 end
------------------------------------------------------------------
set @STMT = @STMT + ') ' + @Update + ' ' + @Delete + '
GO' + Char(13) + Char(13)


PRINT @STMT

Close ColCur
Deallocate ColCur

   fetch next from FKCur into @FKName, @TabName, @User
  end 

close FKCur
deallocate FKCur

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating