Is there a way to merge two primary keys into one and then cascade update all affected relationships? Here’s the scenario:
Customers (idCustomer int PK, Company varchar(50), etc)
CustomerContacts (idCustomerContact int PK, idCustomer int FK, Name varchar(50), etc)
CustomerNotes (idCustomerNote int PK, idCustomer int FK, Note Text, etc)
Sometimes customers need to be merged into one. For example, you have a customer with the id of 1 and another with the id of 2. You want to merge both, so that everything that was 2 is now 1. I know I could write a script that updates all affected tables one by one, but I’d like to make it more future proof by using the cascade rules, so I don’t have to update the script every time there is a new relationship added.
Any ideas?
There’s no automatic way to do it, but you have a couple options, you can manually write the procedures, or you can either code generate the merge on a regular basis or dynamically generate it at run-time. To do this, you can use the
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTSandINFORMATION_SCHEMA.KEY_COLUMN_USAGEandINFORMATION_SCHEMA.TABLE_CONSTRAINTSandINFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLESto build the procedure dynamically.You can also simply wrap the entire operation in a transaction (a good idea anyway). The last step will be to remove the customer being merged out of, so if there is RI on a table you never added and you try to do a merge, it will fail because you cannot remove the customer being merged out of since there are dependent records in a table which wasn’t already added to the merge procedure.