Обновление метаданных пользовательских функций t-SQL
Я занимаюсь программированием на T-SQL, и у меня есть некоторые определения Views в моей базе данных. Модель данных все еще меняется в эти дни, и у меня определены некоторые табличные функции. Иногда я намеренно использую
select * from MYVIEW
в такой табличной функции возвращаются все столбцы. Если вид меняется (или таблица), функция падает, и мне нужно перекомпилировать ее. Я знаю, что в целом это хорошо, что он предотвращает ошибки ада, но все же...
Есть ли способ написания таких функций, чтобы не взрываться у меня на лице каждый раз, когда я что-то меняю в базовой таблице? Или, может быть, я делаю что-то совершенно не так...
Спасибо за помощь
2 ответа
Определить виды как "С SCHEMABINDING"
И я отсылаю вас к моему ответу здесь, который охватывает подобные вещи...
В этом случае проблема не в udf, а в том, как представления ведут себя без SCHEMABINDING.
Редактирование: sp_refreshsqlmodule Кейда Ру может сделать свое дело. Я никогда не использовал это.
Ответ gbn лучший - но когда у вас есть SCHEMABINDING, это часто не позволяет вам вносить базовые изменения, не удаляя сначала SCHEMABINDING, а затем заменяя его при воссоздании модуля. Вы не можете использовать SCHEMABINDING, если ваш объект ссылается на объекты вне базы данных.
Если эта сложность настолько велика, что вы не хотите или не можете использовать SCHEMABINDING, тогда используйте sp_refreshsqlmodule в каком-то обычном процессе, который вы запускаете для проверки ваших модулей SQL на наличие ошибок до того, как они действительно будут использованы (его можно запустить на любом представление без схемы, UDF, сохраненный процесс и т. д.) - ваш друг.
Вы можете использовать оба метода вместе - вы не можете (и нет необходимости) запускать sp_refreshsqlmodule для связанных со схемой объектов.
например, вы можете запустить его только на следующих модулях:
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE (
OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)), N'IsSchemaBound') IS NULL
OR OBJECTPROPERTY(OBJECT_ID(QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME)),
N'IsSchemaBound') = 0
)