
- •Часть 3
- •Часть 3-6. Обеспечение целостности данных Упражнение 1 – Создание новой таблицы и применение ограничений целостности
- •Упражнение 2 – отключение ограничений
- •Часть 3-7. Использование представлений Упражнение 1 – Создание представления
- •Упражнение 2 – создание индексированного представления
- •Упражнение 3 – просмотр системной информации о представлениях
- •Часть 3-8. Создание и использование хранимых процедур Упражнение 1 - Создание хранимой процедуры без параметров
- •Упражнение 2 – создание хранимой процедуры с параметром
- •Упражнение 3 – создание хранимой процедуры с параметрами и значениями по умолчанию
- •Часть 3-9. Создание udf
- •Упражнение 1 - Создание скалярной функции
- •Упражнение 2 - Создание функции, возвращающей табличное значение (I-l t-V udf)
- •Упражнение 3 - Контроль контекста выполнения
- •Часть 3-10. Управление транзакциями и блокировками
- •Упражнение 1 - Применение транзакций
- •Упражнение 2 - Выполнение отката транзакций
- •Упражнение 3 - Просмотр сведений о блокировках
- •Упражнение 4 - Настройка параметров блокировки
- •Часть 3-11. Создание триггеров
- •Упражнение 1 - Создание новой таблицы
- •Упражнение 2 - Создание триггера для таблицы
- •Упражнение 3 – Проверка работы триггера
- •Упражнение 4 – Создание триггера на обновление и вставку
Упражнение 2 - Создание функции, возвращающей табличное значение (I-l t-V udf)
Создание функции, возвращающей табличное значение (In-LineTable-valuedUDF). Создадим функциюSales.GetDiscountForDate, которая находит те же столбцы, что и хранимая процедураGetDiscounts(лаб.8). У функции должен быть входной параметр @DateToCheckdatetime. Он должен использовать использоваться для фильтрации скидок на основе введенной даты. Это позволяет компанииAdventureWorksпроверить, какие скидки будут доступны на указанную дату.
CREATE FUNCTION Sales.GetDiscountForDate (@DateToCheck datetime)
RETURNS TABLE
AS
RETURN
select Description, DiscountPct, Type, Category, StartDate, EndDate, MinQty, MaxQty
from Sales.SpecialOffer
WHERE @DateToCheck Between StartDate AND EndDate
Рис. 3
Для проверки функции введём следующую команду:
SELECT*
FROM Sales.GetDiscountForDate(GETDATE())
ORDER BY DiscountPct DESC
Рис.4. Проверка функции
Выданный результат показывает, что команда запроса выполнена корректно.
Упражнение 3 - Контроль контекста выполнения
Откройте и выполните файл ExecutionContext.sql
Создание скалярной функции
Создадим скалярную функцию GetCurrencyRateв схемеSales, которая находит последнюю ставку конвертации валюты для указанной валюты.
CREATE FUNCTION Sales.GetCurrencyRate
(
@CurrencyCode nchar(3)
)
RETURNS float
AS
BEGIN
DECLARE @CurrencyRate float
SELECT
@CurrencyRate = (SELECT TOP (1) EndOfDayRate
FROM AdventureWorksDW.dbo.DimCurrency C
INNER JOIN AdventureWorksDW.dbo.FactCurrencyRate CR
ON C.CurrencyKey = CR.CurrencyKey
WHERE C.CurrencyAlternateKey = @CurrencyCode
ORDER BY CR.TimeKey DESC)
IF (@CurrencyRate IS NULL)
SET @CurrencyRate = 1.0
RETURN @CurrencyRate
END
Рис. 5
Для проверки функции введём следующую команду:
Select Sales.GetCurrencyRate('GBP')
Рис. 6. Результат работы
Установление отношений доверия между базами данных
Чтобы функция GetCurrencyRate могла искать сведения о валюте, необходимо установить отношения доверия между базами данных AdventureWorks и AdventureWorksDW.
Выполняем следующие команды:
Создание учетной записи пользователя в БД AdventureWorksDW:
USE AdventureWorksDW
IF NOT EXIST (SELECT* FROM sys.database_principals WHERE name='Adam' AND type='U')
CREATE USER Adam FOR LOGIN [MIAMI\Adam]
Рис. 7
Предоставление разрешения AUTHENTICATE для пользователя в БД AdventureWorksDW:
GRANT AUTHENTICATE TO Adam
Рис. 8 разрешениеAUTHENTICATE
Предоставление разрешения SELECTпользователюAdam:
GRANT SELECT TO Adam
Рис 9.Разрешение SELECT
Установка параметра базы данных TRUSTWORTHYдля БДAdventureWorks.
Рис 10. Установка параметра TRUSTWORTHY
Создание и тестирование функции GetCurrencyDiscountedProducts
Создадим функцию GetCurrencyDiscountedProducts в схеме Sales, возвращающую табличное значение. Эта функция аналогична по функциональности функции GetDiscountedProducts, но включает цену и цену со скидкой в альтернативной валюте. Для указания валюты применяется входной параметр @CurrencyCode nchar(3).
Возвращаемая таблица должна содержать следующее определение:
Название столбца |
Тип данных |
ProductID |
int |
Name |
nvarchar(50) |
ListPrice |
money |
CurrencyPrice |
money |
DiscountDescription |
Nvarchar(255) |
DiscountPercentage |
smallmoney |
DiscountAmount |
money |
DiscountedPrice |
Money |
DiscountedCurrencyPrice |
Money |
CREATE FUNCTION Sales.GetCurrencyDiscountedProducts2
(@CurrencyCode nchar(3))
RETURNS @tbl_products TABLE
(ProductID int,
Name nvarchar(50),
ListPrice money,
CurrencyPrice money,
DiscountDescription nvarchar(255),
DiscountPercentage smallmoney,
DiscountAmount money,
DiscountedPrice money,
DiscountedCurrencyPrice money)
AS
BEGIN
DECLARE @CurrencyRate float
SET @CurrencyRate = Sales.GetCurrencyRate(@CurrencyCode)
INSERT @tbl_products
SELECT P.ProductID,
P.Name,
P.ListPrice,
P.ListPrice * @CurrencyRate,
SO.Description,
SO.DiscountPct,
P.ListPrice * SO.DiscountPct,
P.ListPrice - P.ListPrice * SO.DiscountPct,
(P.ListPrice - P.ListPrice * SO.DiscountPct) * @CurrencyRate
FROM Sales.SpecialOfferProduct SOP INNER JOIN
Sales.SpecialOffer SO ON SOP.SpecialOfferID = SO.SpecialOfferID INNER JOIN
Production.Product P ON SOP.ProductID = P.ProductID
WHERE (SO.DiscountPct > 0) AND GetDate() BETWEEN StartDate AND EndDate
ORDER BY ProductID
RETURN
END
GO
Данный запрос в
среде
выглядит так:
Рис. 11
Для проверки функции введём следующую команду:
SELECT *
FROM Sales.GetCurrencyDiscountedProducts ('GBP')
Рис. 12. Проверка функции
Вывод: В ходе лабораторной работы мы изучены основные особенности создания и использования определяемых пользователем функции. Были созданы различные функции, возвращающие табличные и скалярные значения. Также научились устанавливать отношения между БД (т.е. предоставлять разрешения).