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

Есть две таблицы: парковки и квартиры . Каждая квартира может сделать только один запрос на одну парковку . Я создал атрибут "реквест" типа bit и соединил их между таблицами. Соответственно, если на парковку А из квартиры Б был сделан запрос на парковочное место, то повтора записи на эту же парковку из этой же квартиры сделать больше нельзя. Не знаю как это реализовать при помощи триггера. Помогите разобраться пожалуйста
...
Рейтинг: 0 / 0
25.08.2018, 13:53
    #39693255
Sergey Sizov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера запрещающего повторную запись
sonoryНикогда раньше с триггерами не сталкивался, но видимо пора:
Точно пора? Обосновать необходимость именно триггера можете?skip...
Я создал атрибут "реквест" типа bit и соединил их между таблицами.ИХ - это что? Как связал?skip...
Не знаю как это реализовать при помощи триггера.ЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?
...
Рейтинг: 0 / 0
25.08.2018, 14:52
    #39693262
sonory
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера запрещающего повторную запись
Спасибо, за ответ, а то я уже совсем отчаялся.
Sergey SizovТочно пора? Обосновать необходимость именно триггера можете?
Да, точно пора, на самом деле не так давно начал изучать программирование и sql в частности, и в триггеры бы я сейчас не лез, просто так вышло, что нужно выполнить задание при помощи оного.
Sergey SizovИХ - это что? Как связал?
Я создал атрибуты "реквест" в двух таблицах и затем соединил их при помощи внешнего ключа. Не знаю, хорошая эта идея или нет. Сейчас сижу и думаю, что это было вовсе не нужно если учесть, что квартира Б может делать запросы на разные парковки ( А, Б, С и т.д.), так что в таблице квартиры атрибут "реквест" не нужен.
Sergey SizovЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?
"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.
...
Рейтинг: 0 / 0
25.08.2018, 16:20
    #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
25.08.2018, 17:37
    #39693283
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание триггера запрещающего повторную запись
sonory"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.

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

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


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