Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Изменение функций

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

Изменение функции может быть выполнено двумя способами:

  • предварительное удаление функции с помощью команды DROP FUNCTION и последующее создание обновленной функции с помощью команды CREATE FUNCTION;

  • сохранение под именем существующей функции нового кода с помощью команды ALTER FUNCTION.

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

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

Например для изменения функций типа Scalar используется следующий синтаксис:

ALTER FUNCTION [ <owner_name>. ] <function_name> ( [ { @parameter_name <scalar_parameter data_type> [ = default ] } [ ,...n f] ) RETURNS <scalar_return_data_type> [ WITH < function_option> [,...n] ] [ AS ] BEGIN <function_body> RETURN <scalar_expression> END

Как видно, синтаксис команды ALTER FUNCTION напоминает синтаксис команды CREATE FUNCTION. Действительно, при внесении изменения в функцию пользователь должен указывать полностью весь код функции. В этом плане изменение функции с помощью команды ALTER FUNCTION мало чем отличается от удаления и последующего создания функции, так как объём работы в обоих случаях практически одинаков. Упростить изменение функции помогает системная хранимая процедура sp_helptext, позволяющая получить код Transact-SQL, с помощью которого создан тот или иной объект базы данных. Получить код функции можно только в том случае, если при её создании не использовался параметр WITH ENCRYPTION. В противном случае из-за шифрования код просмотреть не удастся.

В качестве примера рассмотрим использование процедуры sp_helptext для получения кода функции Func3, созданной в предыдущем разделе:

ЕХЕС sp_helptext ‘Func3’

Будет в точности возвращён весь текст, приведённый в примере в предыдущем разделе. Если в теле функции присутствовали комментарии, то они также будут выведены. Ранее уже говорилось, что код, используемый для создания объектов базы данных (в частности, функций), хранится в столбце text таблицы syscomments. Для получения кода функции Func3 также можно использовать следующий запрос:

SELECT text FROM syscomments WHERE ID = OBJECT_ID(‘Func3’)

Как видно, в запросе используется функция OBJECT_ID(), с помощью которой можно получить идентификационный номер объекта базы данных (например, функции) по его имени. Дело в том, что в таблице syscomments объекты идентифицируются не по имени, а по идентификационному номеру (столбец ID).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]