Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Описание триггеров






--Триггер, проверяющий что количество товаров добавляемое в заказ

--меньше или равно количеству товаров в Ассортименте

--и изменяющий количество товаров в Ассортименте при добавлении Заказа

CREATE trigger update_quantity

on Zakaz

after INSERT

as

if exists (select *

from inserted i

where i.quantity> (select G.quantity_good

from Goods G

where G.id_good=i.id_good

)

)

begin

PRINT 'Количество товара на складе меньше, чем в Заказе'

ROLLBACK TRANSACTION

RETURN

end

UPDATE G

SET G.quantity_good=G.quantity_good-Z.quantity

from inserted i

JOIN Zakaz Z on Z.id_zakaz=i.id_zakaz AND Z.id_good=i.id_good

JOIN Goods G on G.id_good=Z.id_good

--Удаление триггера

--drop trigger update_quantity

 

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

 

exec Add_zakaz 1, 2, 8

Теперь проверим, что если количество заказываемого товара не больше, чем есть на складе, оно вычтется из количества в Ассортименте:

exec Add_zakaz 5, 25, 2

exec Add_zakaz 6, 10, 1

При добавлении нескольких строк, триггер так же будет срабатывать:

INSERT INTO Zakaz(id_zakaz, id_good, quantity, cost)

select 7, 12, 1, 207.00

union

select 7, 22, 1, 37.00

 

 

INSERT INTO Zakaz(id_zakaz, id_good, quantity, cost)

select 7, 13, 100, 207.00

union

select 7, 23, 100, 37.00

 


 

--Триггер, изменяющий количество товаров в Ассортименте при добавлении Накладной

--и сохраняющий стоимость товара до новой поставки в Историю

CREATE trigger update_quantity2

on Consignment_note

after INSERT

as

if exists(select *

from inserted i

where i.cost< > (select G.p_cost_good

from Goods G

where G.id_good=i.id_good

)

)

begin

INSERT INTO History_cost(id_good, date_time_cost, e_cost_good, p_cost_good)

select i.id_good, getdate(), G.e_cost_good, G.p_cost_good

from inserted i, Goods G

where i.id_good=G.id_good

end

UPDATE G

SET G.quantity_good=G.quantity_good+C.quantity,

G.p_cost_good=C.cost

from inserted i

JOIN Consignment_note C on C.id_cons_note=i.id_cons_note

JOIN Goods G on G.id_good=C.id_good

 

Для проверки работы триггера добавим новую накладную и посмотрим, что измениться в таблицах Ассортимент и История стоимости:

 

 

exec Add_cons_note 8, 1, 3, 100.00

 

 

 


 

--Триггер, сохраняющий стоимость товара до изменения его отпускной цены в Историю

CREATE trigger update_cost

on Goods

after UPDATE

as

if exists(select *

from deleted d

where d.e_cost_good< > (select G.e_cost_good

from Goods G

where G.id_good=d.id_good

)

)

INSERT INTO History_cost(id_good, date_time_cost, e_cost_good, p_cost_good)

select d.id_good, getdate(), d.e_cost_good, G.p_cost_good

from deleted d, Goods G

where d.id_good=G.id_good

--Удаление триггера

--drop trigger update_cost

 

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

 

exec Update_cost_good 'Эрудит', 330

 

 

 

Если мы вводим ту же цену, то в Историю ничего не добавляется:

exec Update_cost_good 'Балда', 230

 



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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал