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: