Хранимые процедуры и функции, определенные пользователем.



Хранимая процедура (StoredProcedure) – это именованный набор команд языка Transact-SQL, хранящийся на сервере в качестве самостоятельного объекта БД

- SP хранится на сервере (пакет – на клиенте)

-  Для вызова используется имя (у пакета нет имени)

- SP могут вызвать друг друга (пакеты не могут)

-  Изменения вносятся в одном месте, на сервере (в пакеты – на всех клиентах)

-  Реализуется модульность

-  Уменьшается объем передаваемой информации по сети

СистемныеХП – входят в состав SQLServer, реализуют все действия администрирования сервера, начинаются с sp_, хранятся в БД master. Контекст выполнения любой

ПользовательскиеХП (User-DefinedSP) – размещаются в пользовательских БД и выполняются в контексте только одной БД

ВременныеХП – существуют только в рамках одного соединения с сервером (временно хранятся в tempDB)

Создание

CREATEPROC[EDURE] <имяпроцедуры>

[{@<параметр><тип>} [= <значение по умолчанию>]

[OUTPUT] ] [,…n]

AS <SQL оператор> [,…n]

a) <имя процедуры> - начинается с «sp_» для системных ХП, «#» - для локальных временных ХП, «##» - для глобальных временных ХП.

b)  Параметры и локальные переменные начинаются с @. Параметры разделяются запятыми, количество параметров до 1024.

c) OUTPUT помечает выходной параметр (он же является и входным)

d) <значение по умолчанию> присваивается входному параметру, если при вызове процедуры ему не присваивается значение

e)  Возвращаемое значение процедуры (как для функции) задается в теле процедуры оператором RETURN

 

Триггеры.

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

Назначение триггеров:

- Обеспечение целостности данных (например, не стандартное каскадное удаление)

- Сокращение затрат на программирование приложений (общие действия – в триггер)

- Автоматическое ведение журнала изменений базы данных

- Автоматическое предупреждение об изменении данных в БД

Классификация по типу действия:

- INSERTTRIGGER – запускаются при выполнении команды INSERT

- UPDATETRIGGER – запускаются при выполнении команды UPDATE

- DELETETRIGGER – запускаются при выполнении команды DELETE

Классификация по типу поведения:

- AFTER – триггер выполняется после успешного выполнения команды

- INSTEADOF – триггер вызывается вместо выполнения команды. Для представлений можно использовать только триггер INSTEADOF.

 

Создание триггера:

CREATETRIGGER<имя триггера>

ON<имя таблицы> | <имя представления>

{FOR | AFTER | INSTEAD OF}

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

AS

<SQL оператор> […n]

FOR и AFTER – синонимы.

AFTER триггер выполняется в транзакции

Сравнение AFTER и INSTEADOF триггеров:AFTER триггер выполняется после того, как действие команды было завершено. Поэтому, если необходимо отменить действие команды, то в AFTER триггере надо использовать конструкцию ROLLBACKTRANSACTION. В этой же ситуации в INSTEADOF триггере не надо отменять действие, т.к. оно не выполняется (т.е. не надо использовать ROLLBACKTRANSACTION). Но для фиксации операции сам триггер должен выполнить соответствующую операцию (INSERT, DELETE, UPDATE).

 

CREATE TRIGGER ExemplarsUpdateTrigger

ON Exemplars

AFTER UPDATE, INSERT

AS

BEGIN

IF (EXISTS (select e.reader_id

                   FROM Exemplars e WHERE e.reader_id IS NOT NULL

                   GROUP BY e.reader_id

                   HAVING count(*) > 2))

BEGIN

       ROLLBACK TRANSACTION

       PRINT ‘Попыткавзятьболее 2 книг'

END

END

 

-- Взять все свободные экземпляры

UPDATE Exemplars SET reader_id = 1 WHERE reader_id IS NULL

 

Таблицы inserted и deleted

- Команда INSERT: inserted содержит все вставляемые строки, deleted – пустая

- Команда DELETE: inserted – пустая, deleted содержит удаленные строки

- Команда UPDATE: inserted содержит новые значения строк, deleted – старые (заменяемые) значения

 

CREATE TRIGGER ExemplarsDeleteTrigger

ON Exemplars

AFTER DELETE

AS

BEGIN

       IF EXISTS(SELECT * FROM deleted WHERE reader_id IS NOT NULL)

       BEGIN

                   ROLLBACKTRANSACTION

                   PRINT ‘Запрещено удалять не возвращенные книги'

       END

END

 

UPDATE(<имя столбца>) – логическая функция для проверки изменения значения столбца (только для команд INSERT и UPDATE)

COLUMNS_UPDATED () - функция возвращает результат типа VARBINARY, каждому разряду соответствует номер столбца (0 – не изменен, 1 – изменен)

 

CREATE TRIGGER reminder ON Person.Address AFTER UPDATE

AS

IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )

BEGIN

RAISERROR (50009, 16, 10)

END;

Предупреждение: объекты, на которые ссылаются триггеры, могут быть удалены или переименованы без ограничения. В результате таких изменений триггер будет работать некорректно.

 

Представления.

Представление (view) – это псевдотаблица, содержимое которой определяется SELECT-запросом,пользователь воспринимает как некоторое виртуальное отношение.

Представление – средство реализации внешних моделей БД

Содержимое представления формируется в момент обращения

В запросах таблицы и представления трактуются одинаково, поэтому их имена не должны совпадать

 

Использование представлений:

Для группировки столбцов разных таблиц в виде одного объекта

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

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

Для предоставления результатов преобразования данных

 

Синтаксис

CREATE VIEW <имя представления>[(<столбец> [,…n])]AS <оператор SELECT>

 

Виды представлений

Горизонтальное представление - этот вид представления широко применяется для уменьшения объема реальных таблиц в обработке и ограничения доступа пользователей к закрытой для них информации.

Пример

(столбцы представления определяются

по умолчанию)

CREATE VIEW SalesDepartment

AS

SELECT * FROM Employee

WHERE department = ‘отделпродаж’

Использование

SELECT name, salary FROM SalesDepartment

 

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

Пример

CREATE VIEW Tabel

AS

SELECT t_num, name, position, department

FROM Employee

Использование

SELECT name, department FROM Tabel

WHEREposition = ‘начальник отдела’

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

Пример

CREATE VIEW Debtors

(isbn, title, reader_id, last_name, home_phone, work_phone, date_back)

AS

SELECT p.isbn, title, r.reader_id, last_name, home_phone, work_phone, date_out+30

FROM Publications p JOIN Exemplars e ON p.isbn = e.isbn

JOIN Readers r ON e.Reader_id = r.Reader_id

WHERE e.date_out + 30 <GetDate()

Использование

SELECT DISTINCT last_name FROM Debtors WHERE home_phone IS NULL

Модификация данных

Ограничения:

- В запросе не должно быть DISTINCT

- Изменяться могут поля только одной таблицы

- Каждое имя в списке параметров представления должно быть простой ссылкой на столбец таблицы

 -В предложении WHERE не должно быть вложенных запросов

- Не должна использоваться группировка

 -Ограничения можно обойти, используя триггеры типа INSTEAD OF к представлению

 

Управление представлениями

Изменение представления:


ALTER VIEW <как в CREATE VIEW>


Дата добавления: 2018-08-06; просмотров: 326; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!