У меня есть несколько таблиц, использующих определяемый пользователем тип данных для столбца PK. Можно ли изменить этот тип с помощью SQL Server 2005?


Я бы предположил, что всегда можно провести рефакторинг плохих или устаревших проектов баз данных, это просто зависит от того, сколько работы вы готовы для этого выполнить.
Если вы хотите заменить пользовательские данные суррогатным ключом, вы должны иметь возможность просто изменить существующую таблицу, чтобы она содержала столбец идентификатора, не допускающий значения NULL, и это должно привести к тому, что всем существующим записям будет автоматически назначен новый ключ. .
После того, как новое поле будет заполнено уникальными идентификаторами, если вам нужно переместиться и заменить ссылки внешнего ключа на эту таблицу, я бы просто изменил эти таблицы, чтобы они содержали новое поле, и использовал бы что-то вроде следующего:
UPDATE child_table
SET new_fk_val =
SELECT new_pk_val
FROM parent_table
WHERE parent_table.old_pk_val = child_table.old_fk_val
После завершения этого шага вы можете отказаться от старого ограничения внешнего ключа, отбросить старый столбец внешнего ключа, удалить столбец старого первичного ключа, установить новое ограничение первичного ключа, а затем установить новое ограничение внешнего ключа.
Конечно, если старая версия отношения родительской и дочерней таблиц была такова, что у вас есть недопустимые записи в дочерней таблице, вам, возможно, придется сделать что-то вроде следующего:
DELETE FROM child_table
WHERE old_fk_val NOT IN
( SELECT old_pk_val FROM parent_table)