4.3.2 Использование триггеров для присвоения значений по умолчаниюСтолбцам таблицы могут присваиваться значения по умолчанию с помощью квалификатора DEFAULT. В качестве таких значений можно задавать константы или результаты вычисления простых выражений. Если же задание значения по умолчанию требует более сложной логики, необходимо использовать триггер. В случае нашего примера предположим, что у галереи имеется правило, согласно которому запрашиваемая цена произведения устанавливается равной удвоенной стоимости его приобретения или сумме общей стоимости приобретения и чистой выручки от продажи этого произведения в прошлом. Это правило реализуется с помощью завершающего триггера, показанного в листинге 4.2. Представление, которое используется в рассматриваемом триггере, имеет следующий вид: CREATE VIEW ArtistWorkNet AS Листинг 4.2. CREATE OR REPLACE TRIGGER SetAskingPrice BEFORE INSERT ON TRANSACTION Триггер сначала подсчитывает количество строк в таблице TRANSACTION, в которых значение WorkID равно :new.WorkID. Поскольку это предваряющий триггер, произведение еще не добавлено в базу данных, и количество будет равным нулю, если это произведение не появлялось в галерее ранее. В этом случае :new.AskingPrice устанавливается равным удвоенному значению AcquisitionPrice. Если произведение появлялось в галерее в прошлом, рассчитывается средняя чистая прибыль от его продажи с помощью представления ArtistWorkNet. После этого вычисляется переменная newPrice как сумма средней чистой прибыли и стоимости приобретения. Наконец, :new.AskingPrice присваивается большее из двух значений — newPrice или удвоенное значение AcquisitionPrice. Так как триггер предваряющий, для усреднения можно использовать встроенную функцию AVG: новая строка еще не добавлена в таблицу WORK, поэтому она не будет учтена при расчете среднего значения. Следует обратить внимание на один ньюанс: если в какой-либо из строк представления ArtistWorkNet столбец SalesPrice или AcquisitionPrice является пустым, это может вызвать проблемы при вычислениях в триггере. Рассмотренный триггер выполняет полезную функцию, избавляя персонал галереи от значительного количества ручной работы, а также повышая точность результатов.
|