Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД вопросы 16-29.docx
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
169.14 Кб
Скачать

23. Определение пользовательской функции. Основное отличие пользовательских функций от хранимых процедур. Основное отличие скалярной пользовательской функции от табличной.

Функция пользователя (UDF) представляет собой модуль Transact-SQL, который принимает один или более входных аргументов и подсчитывает возвращаемое значение. Например, функция может вычислять расстояние между двумя точками, формировать список сотрудников, работающих под управлением заданного менеджера.

UDF подобны хранимым процедурам. Т.е. UDF может содержать как операторы управления ходом выполнения программы, так и операторы DML. Одно из различий заключается в том, что пользовательские функции можно использовать как и любое другое выражение в SQL запросе, в то время как хранимые процедуры должны быть вызваны с помощью функции CALL

Отличие UDF от хранимых процедур состоит в следующем:

  • UDF не поддерживает выходных параметров.

  • UDF не может использоваться для получения результатов “FOR XML”. Результат “FOR XML” может быть в хранимой процедуре.

  • Ошибки Transact-SQL, которые вызывают отмену оператора с последующим переходом к следующему оператору в модуле (триггере или хранимой процедуре), внутри функции обрабатываются иначе. В функциях ошибки Transact-SQL прерывают выполнение функции. Это, в свою очередь, приводит к отмене оператора, который вызвал функцию.

Типы функций:

  • Скалярнозначные функции

  • Однострочные (inline) табличнозначные функции

  • Многооператорныетабличнозначныефунции

Основное отличие скалярной пользовательской функции от табличной:

Пользовательская скалярная функция возвращает в качестве ответа единственное значение при каждом вызове функции. Функции являются скалярнозначными, если предложение RETURNS определяет один из скалярных типов данных. Пользовательская табличная функция возвращает в качестве ответа таблицу.

Табличная пользовательская функция состоит из следующих разделов:

  1. Область определения имени функции (Inline_Function_Name);

  2. Параметры, передаваемые в процедуру ( @Param1@Param2 );

  3. RETURNS TABLE показывает, что функция является табличной, то есть возвращает таблицу;

  4. Тело самой пользовательской функции, состоит из команды SELECT языка программирования запросов T-SQL.

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

Для однострочных табличнозначных функций предложение RETURNS задает TABLE без указания списка столбцов.

Если предложение RETURNS задает тип TABLE с определением столбцов и их типов данных, функция является многооператорной табличнозначной функцией.

24.Понятие триггера. Особенности и синтаксис построения триггера на языке TransactSql.

Фактически триггер — это специальный вид хранимой процедуры, которую SQL Server вызывает при выполнении операций модификации соответствующих таблиц.

Триггер автоматически активизируется при выполнении операции, с которой он связан.

Триггеры связываются с одной или несколькими операциями модификации над одной таблицей.

В разных коммерческих СУБД рассматриваются разные триггеры.

Так, в MS SQL Server триггеры определены только как постфильтры, то есть такие триггеры, которые выполняются после свершения события.

В СУБД Oracle определены два типа триггеров:

  • триггеры, которые могут быть запущены перед реализацией операции модификации, они называются BEFORE-триггерами,

  • триггеры, которые активизируются после выполнения соответствующей модификации, аналогично триггерам MS SQL Server — они называются AFTER-триггерами.

Триггеры могут быть эффективно использованы для поддержки семантической целостности БД, однако приоритет их ниже, чем приоритет правил-ограничений (constraints), задаваемых на уровне описания таблиц и на уровне связей между таблицами.

При написании триггеров всегда надо помнить об этом, при нарушении правил целостности по связям (DRI declarative Referential Integrity) триггер просто может никогда не сработать.

Пример создания триггера

В стандарте SQL1 ни хранимые процедуры, ни триггеры были не определены.

В добавлении к стандарту SQL2, выпущенному в 1996 году, те и другие объекты были стандартизированы и определены.

Для создания триггеров используется специальная команда:

CREATE TRIGGER <имя_триггера>

ON <имя_таблицы>

FOR {[INSERT][, UPDATE] [, DELETE] }

[WITH ENCRIPTING]

AS

SQL-операторы (Тело триггера)

Имя триггера является идентификатором во встроенном языке программирования СУБД и должно удовлетворять соответствующим требованиям.

В параметре FOR задается одна или несколько операций модификации, которые запускают данный триггер.

Параметр WITH ENCRIPTING имеет тот же смысл, что и для хранимых процедур, он скрывает исходный текст тела триггера.

Существует несколько правил, которые ограничивают набор операторов, которые могут быть использованы в теле триггера.

Так, в большинстве СУБД действуют следующие ограничения:

  • Нельзя использовать в теле триггера операции создания объектов БД (новой БД, новой таблицы, нового индекса, новой хранимой процедуры, нового триггера, новых индексов, новых представлений).

  • Нельзя использовать в триггере команду удаления объектов DROP для всех типов базовых объектов БД.

  • Нельзя использовать в теле триггера команды изменения базовых объектов ALTER TABLE, ALTER DATABASE.

  • Нельзя изменять права доступа к объектам БД, то есть выполнять команду GRAND или REVOKE.

  • Нельзя создать триггер для представления VIEW .

  • В отличие от хранимых процедур, триггер не может возвращать никаких значений, он запускается автоматически сервером и не может связаться самостоятельно ни с одним клиентом.