Скалярная функция, используемая в вычисляемом столбце, какой самый чистый способ обновить функцию?

10

Я хочу обновить скалярную функцию в нашей базе данных. Эта функция используется для нескольких вычисляемых столбцов в таблице ключей, поэтому я получаю ошибку зависимости, если пытаюсь ее обновить. Я могу явно удалить столбцы, обновить функцию и заново добавить столбцы, но без лишних усилий это изменит порядок столбцов и может иметь другие непредвиденные последствия. Я задавался вопросом, был ли более чистый способ сделать это?

robertc
источник
4
Я решил это только частично, создав фиктивные функции, вызывающие реальные. Конечно, если подпись изменится, то все снова и снова.
3
К сожалению, я не думаю, что есть какой-то «волшебный» или «чище» способ сделать это. Если вам нужно изменить функцию - вам нужно удалить столбцы, изменить функцию и заново добавить все столбцы. Обойти это невозможно.
marc_s
@marc_s Ну, это стоит того, много умных людей здесь :)
robertc
Согласитесь с приведенными выше комментариями. Возможно, у SYNONYMs была возможность предложить некоторую помощь (см. SYNONYM в вычисляемом столбце), но вы не можете изменить один раз созданный синоним, чтобы «перенаправить» его на другой объект.
AdaTheDev
1
Тем не менее, это еще не так болезненно, как обновление определения CLR UDT (даже если изменение является лишь подстройкой метода и никак не влияет на представление хранилища)
Martin Smith

Ответы:

2

Это может быть больше работы, но оно должно получить (примерно) то, что вы после:

1 - Создайте новую таблицу, в которой есть только ваш ПК из основной таблицы и обновленная функция.

2 - Оставь свой старый столбец

3 - Переименуйте свой старый стол в что-то вроде TableName_Base

4 - Создайте объект, VIEWкоторый соединяет вашу основную таблицу с таблицей поиска, с полями в том порядке, в котором вы хотите их видеть. Назовите представление, каким бы ни было ваше первоначальное имя таблицы.

Это потенциально может создать некоторые проблемы INSERTSи, UPDATESхотя, так как вы будете получать доступ через представление. Чтобы справиться с этим, вы можете либо вставить в таблицу напрямую, минуя вид.

JNK
источник
Это звучит как дополнительная работа и тот же уровень риска, что и удаление и повторное добавление столбцов.
Робертc
1
@robertc Это будет менее разрушительно, если это среда с высокими транзакциями, но да, она все еще довольно грязная.
JNK