Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание ограничения. Курсовая работа. / 9 сообщений из 9, страница 1 из 1
19.01.2021, 17:22
    #40037233
Grufl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
Привет, друзья! Имеется простенькая база гостиницы "Hotel". Одной из таблиц является таблица "Booking"(бронирование) в которой есть поля "IdBooking" - первичный ключ, "IdClient" - идентификатор клиента, берется из таблицы "Client", "RoomNumber" - номер комнаты, "CheckInDate" - дата заселения в номер, "CheckOutDate" - дата выселения, "BookingPrice" - итоговая цена номера. Необходимо в таблице "Booking" реализовать ограничение через скалярную функцию чтобы нельзя было бронировать номер на те даты, на которые он уже забронирован. Много раз пытался изменить функцию, но каждый раз приводит к одной и той же ошибке связанной с "inserted".
Версия ПО:
Microsoft SQL Server 2019 (RTM-GDR) (KB4583458) - 15.0.2080.9 (X64) Nov 6 2020 16:50:01 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Windows 10 Home 10.0 <X64> (Build 19042: )

Сама таблица "Booking":
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
USE Hotel;

CREATE TABLE Booking
(
IdBooking INT NOT NULL PRIMARY KEY IDENTITY(1,1),
IdClient INT NOT NULL REFERENCES Client(IdClient),
RoomNumber MONEY NOT NULL,
CheckInDate DATE NOT NULL,
CheckOutDate DATE NOT NULL,
BookingPrice MONEY NOT NULL
);



Данные в таблице:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
USE Hotel;

INSERT INTO Booking (IdClient, RoomNumber, CheckInDate, CheckOutDate, BookingPrice) 

VALUES
(1, 1, '01-01-2020', '07-01-2020', 5250),
(2, 2, '10-01-2020', '15-01-2020', 3750),
(3, 3, '12-01-2020', '15-01-2020', 2250),
(4, 4, '13-01-2020', '17-01-2020', 3750),
(5, 6, '03-02-2020', '16-02-2020', 10500),
(6, 5, '20-02-2020', '24-02-2020', 3000),
(7, 7, '20-02-2020', '24-02-2020', 3000),
(8, 8, '22-02-2020', '25-02-2020', 2250),
(9, 9, '23-02-2020', '28-02-2020', 3750),
(10, 10, '25-02-2020', '28-02-2020', 3000)



Скалярная функция через которую пытался реализовать ограничение:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
USE Hotel
GO
CREATE FUNCTION RoomBlock()
RETURNS BIT
AS BEGIN
IF EXISTS(SELECT RoomNumber, CheckInDate, CheckOutDate FROM Booking JOIN inserted ON Booking.IdBooking = inserted.IdBooking
HAVING
(inserted.CheckInDate BETWEEN Booking.CheckInDate AND Booking.CheckOutDate)
AND
(inserted.CheckOutDate BETWEEN Booking.CheckInDate AND Booking.CheckOutDate)
AND
inserted.RoomNumber = Booking.RoomNumber)
RETURN 0
RETURN 1
END
GO
ALTER TABLE Booking
ADD CONSTRAINT RoomBlockCheck
CHECK (dbo.RoomBlock() = 1)



Ошибка:
Msg 208, Level 16, State 1, Line 17
Недопустимое имя объекта "inserted".
...
Рейтинг: 0 / 0
19.01.2021, 17:31
    #40037234
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
Grufl


Ошибка:
Msg 208, Level 16, State 1, Line 17
Недопустимое имя объекта "inserted".


таблицы inserted & deleted существуют только в контексте триггеров


https://dotnettutorials.net/lesson/magic-tables-in-sql-server/Inserted and Deleted tables are temporary tables that are created by SQL Server in the context of a trigger. That means these two tables can only be available as part of a trigger. If you try to access these tables outside of a trigger, then you will get an error.


https://docs.microsoft.com/en-us/sql/relational-databases/triggers/use-the-inserted-and-deleted-tables
...
Рейтинг: 0 / 0
19.01.2021, 17:36
    #40037236
Grufl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
komrad,

Спасибо! Профан в sql, не знал этого. Буду очень признателен, если поможете с функцией или направите в нужное русло, поскольку без inserted не имею понятия как это реализовать.
...
Рейтинг: 0 / 0
19.01.2021, 17:42
    #40037237
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
Grufl,

во второй приведенной ссылке есть пример использования inserted таблиц при проверке бизнес-логики.

"An Example of Using the inserted Table in a Trigger to Enforce Business Rules"
...
Рейтинг: 0 / 0
19.01.2021, 17:47
    #40037239
Grufl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
komrad,

Проблема в том, что по заданию ограничение необходимо задать с помощь скалярной функции, а не триггера. К сожалению, это обязательное условие курсовой работы.
...
Рейтинг: 0 / 0
19.01.2021, 18:01
    #40037244
PaulYoung
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
...
Рейтинг: 0 / 0
19.01.2021, 18:10
    #40037247
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
Grufl,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create function dbo.BookingHasIntersections
(
 @IdBooking int
)
returns bit
as
begin
 declare @result bit;

 if exists(
   select
    *
   from
    Booking a join
    Booking b on b.RoomNumber = a.RoomNumber and b.IdBooking <> a.IdBooking and a.CheckInDate <= b.checkOutDate and a.CheckOutDate >= b.CheckInDate
   where
    a.IdBooking = b.IdBooking
  )
  set @result = 1;
 else
  set @result = 0;

 return @result;
end;


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE Booking
(
IdBooking INT NOT NULL PRIMARY KEY IDENTITY(1,1),
IdClient INT NOT NULL REFERENCES Client(IdClient),
RoomNumber MONEY NOT NULL,
CheckInDate DATE NOT NULL,
CheckOutDate DATE NOT NULL,
BookingPrice MONEY NOT NULL,
check (dbo.BookingHasIntersections(IdBooking) = 0)
);
...
Рейтинг: 0 / 0
19.01.2021, 18:13
    #40037248
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
komrad
таблицы inserted & deleted существуют только в контексте триггеров
Нет.
...
Рейтинг: 0 / 0
19.01.2021, 18:22
    #40037252
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание ограничения. Курсовая работа.
iap
komrad
таблицы inserted & deleted существуют только в контексте триггеров
Нет.

+ output
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание ограничения. Курсовая работа. / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]