- •Прокат автомобилей
- •Анализ предметной области
- •Описание предметной области.
- •Основные бизнес процессы
- •Реляционная модель базы данных
- •Заполнение таблиц данными
- •Запросы
- •Настройка безопасности
- •Создание Backup
- •1 Способ
- •2 Способ
- •Представления
- •Пользовательские функции
- •Курсоры
- •Триггеры
- •Процедуры
Курсоры
Курсор DisplayClients выводит информацию о клиентах, и список арендованных ими автомобилей соответственно.
DROP PROCEDURE DisplayClientAndTheirRentedCars
GO
CREATE PROCEDURE DisplayClientAndTheirRentedCars AS
DECLARE DisplayClients CURSOR
FOR
SELECT c.client_id
,c.name
,c.phone
FROM [dbo].[client] as c
OPEN DisplayClients
DECLARE @ClientID int
DECLARE @Name varchar(50)
DECLARE @Phone varchar(15)
DECLARE @DisplayAll varchar(100)
FETCH NEXT FROM DisplayClients into @ClientID,@Name,@Phone
WHILE @@FETCH_STATUS <> -1
BEGIN
DECLARE DisplayCarNumber CURSOR
FOR
SELECT DISTINCT contr.car_number
FROM [dbo].[contract] as contr
WHERE contr.client_id = @ClientID
OPEN DisplayCarNumber
declare @car_number varchar(50)
FETCH NEXT FROM DisplayCarNumber into @car_number
SET @DisplayAll = @Name + ', ' + @Phone + ' - '
WHILE @@FETCH_STATUS = 0
BEGIN
SET @DisplayAll = @DisplayAll + @car_number + ', '
FETCH NEXT FROM DisplayCarNumber into @car_number
END
CLOSE DisplayCarNumber
DEALLOCATE DisplayCarNumber
FETCH NEXT FROM DisplayClients into @ClientID,@Name,@Phone
PRINT left(@DisplayAll,LEN(@DisplayAll)-1)
END
CLOSE DisplayClients
DEALLOCATE DisplayClients
GO
EXEC DisplayClientAndTheirRentedCars
GO
Курсор DisplayClients выводит информацию о клиентах, и список арендованных ими автомобилей соответственно.
DROP PROCEDURE DemandForCar
GO
CREATE PROCEDURE DemandForCar AS
DECLARE @car_number varchar(9)
DECLARE @date date
DECLARE @count int
DELETE FROM car_demand
DECLARE @DemandForCar CURSOR
SET @DemandForCar = CURSOR SCROLL
FOR
SELECT c.car_number
FROM dbo.car as c
OPEN @DemandForCar
FETCH NEXT FROM @DemandForCar INTO @car_number
WHILE @@FETCH_STATUS =0
BEGIN
SET @date=GETDATE()
SELECT @count = DATEDIFF(MONTH, cont.date_of_end, @date)
FROM dbo.car as c
INNER JOIN dbo.contract as cont
on c.car_number=cont.car_number
WHERE c.car_number=@car_number
IF @count > 3
BEGIN
INSERT INTO car_demand (car_number,count_month, date_time,recomends)
VALUES(@car_number,@count,@date,'Невостребованный автомобиль')
END
else
INSERT INTO car_demand (car_number,count_month, date_time,recomends)
VALUES(@car_number,@count,@date, 'Востребованный автомобиль')
FETCH NEXT FROM @DemandForCar INTO @car_number
END
CLOSE @DemandForCar
GO
EXEC DemandForCar
GO
Триггеры
Триггер report_attempts_car_rental при добавлении в таблицу contract еще одной строки с информацией о контракте, изменяет статут автомобиля в таблице car. Если же данный автомобиль уже занят или находиться на обслуживании, то триггер выдает ошибку. А информация о попытке выдать занятый автомобиль вноситься в таблицу car_logs, в частности данные кто и когда пытался выдать автомобиль.
--Создание триггера
DROP TRIGGER report_attempts_car_rental
GO
CREATE TRIGGER report_attempts_car_rental
ON [dbo].[contract]
for INSERT
AS
BEGIN
DECLARE INS CURSOR
FOR SELECT i.contract_number,i.car_number
FROM inserted i
OPEN INS
DECLARE @ContractID int
DECLARE @CarNumber varchar(9)
FETCH NEXT FROM INS into @ContractID,@CarNumber
WHILE(@@FETCH_STATUS <> - 1 )
BEGIN
IF((SELECT c.willingness_to_lease_id
FROM [dbo].[car] as c
WHERE c.car_number = @CarNumber) <> 1)
BEGIN
DELETE FROM contract
WHERE contract.contract_number = @ContractID;
DECLARE @log varchar(50) = 'Автомобиль: ' + @CarNumber + ' занят '
insert into car_logs
(date_logs,user_name, car_number)
values
(GETDATE(),SUSER_NAME(),@CarNumber)
--END
FETCH NEXT FROM INS into @ContractID,@CarNumber
RAISERROR(@log,10,10)
END
ELSE BEGIN
UPDATE car
SET car.willingness_to_lease_id = 2
FROM [dbo].[car]
WHERE @CarNumber = car.car_number
FETCH NEXT FROM INS into @ContractID,@CarNumber
END
END
CLOSE INS
DEALLOCATE INS
END
GO
--ДО
-
-Таблица
contract
--Таблица car
INSERT INTO contract (contract_number, client_id, employee_id, car_number,
duration_of_lease, date_of_signing, date_of_payment, date_of_end, payment_status_id)
VALUES (7500, 2, 1,'А164АУ154', 7,'2015.11.18','','2015.11.25', 1)
--ПОСЛЕ --Удачное добавление
--Ошибка добавления
Триггер report_logs_trigger при удалении отчета работника, в таблицу report_logs заносятся данные об удалении.
--Создание триггера report_logs_trigger
DROP TRIGGER report_logs_trigger
GO
CREATE TRIGGER report_logs_trigger
ON [dbo].[report]
FOR delete
as
INSERT into report_logs
SELECT Getdate()
,Suser_name()
,d.report_id
,d.employee_id
,d.car_number
,d.contract_number
,d.information_damage
,d.amount_maintenance
,d.status_car_id
FROM deleted as d
GO
ДО:
--Состояние
таблицы report
до удаления
--Удаление DELETE FROM car_rental.dbo.report WHERE report_id = 1; GO
ПОСЛЕ:
--Таблица
report
-
-Таблица
report_logs
