tech > code > adventures in code > scary sql
	
	
	  15 Sep 2009 18:23:43 EST
	
	
	Here's some SQL you should never use.
select  
	cast(  
	' Alter Table [' +  
	src.name +  
	'] Drop Constraint [' +  
	ky.name + ']' +
	char(10) + ' go ' + char(10) +  
	' Alter Table [' +  
	src.name +  
	'] Add Constraint [' +  
	ky.name +  
	'] foreign key ( ['+  
	col_name(src_c.referenced_object_id, src_c.referenced_column_id) +  
	'] ) references ' +  
	refs.name +  
	' ( ['+  
	col_name(refs_c.referenced_object_id, refs_c.referenced_column_id) +  
	'] ) ON DELETE CASCADE ' +  
	char(10) + ' go ' + char(10)  
	as text)  
from sys.foreign_keys ky --key  
inner join sys.objects src --origin  
        on ky.parent_object_id = src.object_id  
inner join sys.objects refs --references  
        on ky.referenced_object_id = refs.object_id  
inner join sys.foreign_key_columns src_c --origin column  
        on ky.object_id = src_c.constraint_object_id  
inner join sys.foreign_key_columns refs_c --reference column  
        on ky.object_id = refs_c.constraint_object_id  
	What does it do? Well on SQL Server 2005/8, it will produce a script (output in text mode or the GO's won't work) that will rewrite all your Foreign Keys to cascade deletes. So now, instead of getting a violation when you try delete an item because it has foreign keys, it will silently delete all the data associated with that foreign key. Scary, right?
Notes:
- query assumes the FK consists of a 1-to-1 column mapping, no composite columns
 - you may need to do a little jimmy-ing with the resulting sql to run it nicely
 - this is silly dangerous. unless you have a damn good reason to do this (like, you don't give a crap about your data and you're setting up a one-off testing enviroment or somesuch) you shouldn't do this.
 - If the script runs incorrectly, and then you run it again - you will have lost FK's. So be sure to save the very first output of the script to recreate all keys in the event of something going wrong.
 
required, hidden, gravatared
required, markdown enabled (help)
* item 2
* item 3
are treated like code:
if 1 * 2 < 3:
print "hello, world!"
are treated like code: