Обновление метаданных пользовательских функций t-SQL - PullRequest
0 голосов
/ 16 марта 2010

Я занимаюсь программированием на T-SQL, и у меня есть некоторые определения Views в моей базе данных. Модель данных все еще меняется в эти дни, и у меня определены некоторые табличные функции. Иногда я сознательно использую

 select * from MYVIEW

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

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

Спасибо за помощь

Ответы [ 2 ]

3 голосов
/ 16 марта 2010

ответ 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
                )
2 голосов
/ 16 марта 2010

Определить виды как "С SCHEMABINDING"

И я отсылаю вас к моему ответу, который охватывает подобные вещи ...

«выбрать * из таблицы» против «выбрать colA, colB и т. Д. Из таблицы», интересное поведение в SqlServer2005

В этом случае проблема не в udf, а в том, как представления ведут себя без SCHEMABINDING

Редактировать: sp_refreshsqlmodule Кейда Ру может сделать свое дело. Я никогда не использовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...