powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Создание триггера запрещающего повторную запись
6 сообщений из 6, страница 1 из 1
Создание триггера запрещающего повторную запись
    #39693249
sonory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никогда раньше с триггерами не сталкивался, но видимо пора:

Есть две таблицы: парковки и квартиры . Каждая квартира может сделать только один запрос на одну парковку . Я создал атрибут "реквест" типа bit и соединил их между таблицами. Соответственно, если на парковку А из квартиры Б был сделан запрос на парковочное место, то повтора записи на эту же парковку из этой же квартиры сделать больше нельзя. Не знаю как это реализовать при помощи триггера. Помогите разобраться пожалуйста
...
Рейтинг: 0 / 0
Создание триггера запрещающего повторную запись
    #39693255
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonoryНикогда раньше с триггерами не сталкивался, но видимо пора:
Точно пора? Обосновать необходимость именно триггера можете?skip...
Я создал атрибут "реквест" типа bit и соединил их между таблицами.ИХ - это что? Как связал?skip...
Не знаю как это реализовать при помощи триггера.ЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?
...
Рейтинг: 0 / 0
Создание триггера запрещающего повторную запись
    #39693262
sonory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, за ответ, а то я уже совсем отчаялся.
Sergey SizovТочно пора? Обосновать необходимость именно триггера можете?
Да, точно пора, на самом деле не так давно начал изучать программирование и sql в частности, и в триггеры бы я сейчас не лез, просто так вышло, что нужно выполнить задание при помощи оного.
Sergey SizovИХ - это что? Как связал?
Я создал атрибуты "реквест" в двух таблицах и затем соединил их при помощи внешнего ключа. Не знаю, хорошая эта идея или нет. Сейчас сижу и думаю, что это было вовсе не нужно если учесть, что квартира Б может делать запросы на разные парковки ( А, Б, С и т.д.), так что в таблице квартиры атрибут "реквест" не нужен.
Sergey SizovЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?
"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.
...
Рейтинг: 0 / 0
Создание триггера запрещающего повторную запись
    #39693275
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonory,

вариант 1
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
set nocount on;
go
create table tFlat (
  [flat_id] int,
  [parking_id] int
)
go
create table tParking (
  [parking_id] int,
  [flag] bit
)
go
create view vRequests
with schemabinding
as
select
      f.flat_id as [flat_id],
      f.[parking_id] as [parking_id],
      p.[flag] as [request]
from [dbo].[tFlat] f join [dbo].[tParking] p on p.parking_id = f.parking_id
where p.[flag] = 1
go
create unique clustered index ix0 on vRequests ([flat_id], [parking_id], [request])
go
create view vRequests2
with schemabinding
as
select row_number() over (order by [flat_id]) as [id], [flat_id], [parking_id], [request] from [dbo].[vRequests] with(noexpand)
go

create view vRequests3 
as
with x as (
select [flat_id], [parking_id], [request] from [dbo].[vRequests] with(noexpand)
union all
select f.[flat_id], f.[parking_id], p.[flag]
from [dbo].[tFlat] f join [dbo].[tParking] p on p.parking_id = f.parking_id
where p.[flag] = 0
)
select row_number() over (order by [flat_id]) as [id], [flat_id], [parking_id], [request] from x
go

insert into tParking values (1, 1), (2, 1), (3, 0), (4, 1)
select * from vRequests2
insert into tFlat values (1, 1), (1, 2), (2, 1)
select * from vRequests2
go

insert into tParking values (5, 0)
insert into tFlat values (2, 5)
insert into tFlat values (2, 5)
select * from vRequests2
select * from vRequests3
go

insert into tFlat values (1, 5)
insert into tFlat values (1, 5)
select * from vRequests3
go
update tParking 
set flag = 1
where parking_id = 5

drop view vRequests3
drop view vRequests2
drop view vRequests
drop table tParking
drop table tFlat




вариант 2
Код: 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.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
set nocount on;
go
create table tFlat (
  [flat_id] int,
  [parking_id] int
)
go
create table tParking (
  [parking_id] int,
  [flag] bit
)
go

create trigger trg0 on tFlat after insert, update
as
if exists (select 1 from [dbo].[tFlat] f with(readpast)
                        join [dbo].[tParking] p on p.[parking_id] = f.[parking_id] and p.[flag] = 1
                     group by f.[flat_id], f.[parking_id]
                     having count(1) > 1) begin
                     throw 50000, 'Существуют квартиры с зарегистрированными парковками. Операция не будет выполнена', 1
end

insert into tParking values (1, 1), (2, 1), (3, 0), (4, 1)
select * from tParking
insert into tFlat values (1, 1), (1, 2), (2, 1)

insert into tFlat values (1, 2), (5, 1)
select f.flat_id, f.parking_id, p.flag from tFlat f join tParking p on p.parking_id = f.parking_id

insert into tFlat values (1, 3)
insert into tFlat values (1, 3)

insert into tFlat values (1, 4)
insert into tFlat values (1, 4)

select f.flat_id, f.parking_id, p.flag from tFlat f join tParking p on p.parking_id = f.parking_id




можно еще кучу вариантов придумать, но я бы на вашем месте задумался об ограничении на уровне логики хранимых процедур, и не писал бы код который напрямую манипулирует данными в таблицах из приложения.
...
Рейтинг: 0 / 0
Создание триггера запрещающего повторную запись
    #39693283
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonory"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.

Код: sql
1.
2.
create unique index UX_квартира on [таблица парковки] (квартираID) where Реквест = Тру;
create unique index UX_парковка on [таблица парковки] (парковкаID) where Реквест = Тру;
...
Рейтинг: 0 / 0
Создание триггера запрещающего повторную запись
    #39693687
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sonory,

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


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