Как обновить определение пользовательской функции T-SQL после переопределения зависимого объекта?


Рассмотрим следующую последовательность событий:

  1. вид v_Foo определен
  2. определена пользовательская функция GetFoo (), которая включает все столбцы из v_Foo (с помощью 'Select * ...')
  3. определение v_Foo изменяется и теперь включает больше столбцов
  4. Теперь я хочу, чтобы GetFoo () включил новые столбцы в v_Foo, но он по-прежнему ссылается на старое определение

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

2 2

2 ответа:

Короткий и простой ответ: Нет .

Вы должны переопределить RETURN TABLE заявление в табличной пользовательской функции GetFoo()
всякий раз, когда определение v_Foo изменяется.

Но есть способ обойти его (переводится как непрактичный).
  1. создайте триггер DDL на ALTER_VIEW событие.
  2. затем используйте динамический SQL для создания GetFoo().

Было бы неплохо посмотреть определение функции. Все, что вы сказали, это использование SELECT *. Вы можете быть более конкретным?

Вы также забыли сообщить нам, какую версию SQL Server вы используете. If >= 2005, вы смотрели на sp_refreshsqlmodule? http://technet.microsoft.com/en-us/library/bb326754.aspx http://technet.microsoft.com/en-us/library/bb326754%28SQL.90%29.aspx

Любопытно, какие у вас причины настаивать на SELECT *. Множество дискуссия об этом здесь, но минусы все равно перевешивают плюсы с большим отрывом, ИМХО:

Http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/bad-habits-to-kick-using-select-omitting-the-column-list.aspx