powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание ограничения. Курсовая работа.
9 сообщений из 9, страница 1 из 1
Создание ограничения. Курсовая работа.
    #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
Создание ограничения. Курсовая работа.
    #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
Создание ограничения. Курсовая работа.
    #40037236
Grufl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
komrad,

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

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

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

Проблема в том, что по заданию ограничение необходимо задать с помощь скалярной функции, а не триггера. К сожалению, это обязательное условие курсовой работы.
...
Рейтинг: 0 / 0
Создание ограничения. Курсовая работа.
    #40037244
Фотография PaulYoung
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Создание ограничения. Курсовая работа.
    #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
Создание ограничения. Курсовая работа.
    #40037248
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad
таблицы inserted & deleted существуют только в контексте триггеров
Нет.
...
Рейтинг: 0 / 0
Создание ограничения. Курсовая работа.
    #40037252
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap
komrad
таблицы inserted & deleted существуют только в контексте триггеров
Нет.

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


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