Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание триггера запрещающего повторную запись  [new]
sonory
Member

Откуда:
Сообщений: 2
Никогда раньше с триггерами не сталкивался, но видимо пора:

Есть две таблицы: парковки и квартиры. Каждая квартира может сделать только один запрос на одну парковку. Я создал атрибут "реквест" типа bit и соединил их между таблицами. Соответственно, если на парковку А из квартиры Б был сделан запрос на парковочное место, то повтора записи на эту же парковку из этой же квартиры сделать больше нельзя. Не знаю как это реализовать при помощи триггера. Помогите разобраться пожалуйста
25 авг 18, 13:33    [21653816]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера запрещающего повторную запись  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1507
sonory
Никогда раньше с триггерами не сталкивался, но видимо пора:
Точно пора? Обосновать необходимость именно триггера можете?
skip...
Я создал атрибут "реквест" типа bit и соединил их между таблицами.
ИХ - это что? Как связал?
skip...
Не знаю как это реализовать при помощи триггера.
ЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?
25 авг 18, 13:53    [21653824]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера запрещающего повторную запись  [new]
sonory
Member

Откуда:
Сообщений: 2
Спасибо, за ответ, а то я уже совсем отчаялся.
Sergey Sizov
Точно пора? Обосновать необходимость именно триггера можете?

Да, точно пора, на самом деле не так давно начал изучать программирование и sql в частности, и в триггеры бы я сейчас не лез, просто так вышло, что нужно выполнить задание при помощи оного.
Sergey Sizov
ИХ - это что? Как связал?

Я создал атрибуты "реквест" в двух таблицах и затем соединил их при помощи внешнего ключа. Не знаю, хорошая эта идея или нет. Сейчас сижу и думаю, что это было вовсе не нужно если учесть, что квартира Б может делать запросы на разные парковки (А, Б, С и т.д.), так что в таблице квартиры атрибут "реквест" не нужен.
Sergey Sizov
ЭТО - это что? ЧТО реализовать? Невозможность дублирования? Именно триггером?

"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.

К сообщению приложен файл. Размер - 56Kb
25 авг 18, 14:52    [21653841]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера запрещающего повторную запись  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
sonory,

+ вариант 1

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

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



можно еще кучу вариантов придумать, но я бы на вашем месте задумался об ограничении на уровне логики хранимых процедур, и не писал бы код который напрямую манипулирует данными в таблицах из приложения.
25 авг 18, 16:20    [21653886]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера запрещающего повторную запись  [new]
aleks222
Member

Откуда:
Сообщений: 850
sonory
"Это" - это саму задачу, а именно написание триггера, который будет запрещать запись в таблицу парковки если значение у атрибута "реквест" (который находится в таблице парковки) будет тру.


create unique index UX_квартира on [таблица парковки] (квартираID) where Реквест = Тру;
create unique index UX_парковка on [таблица парковки] (парковкаID) where Реквест = Тру;
25 авг 18, 17:37    [21653920]     Ответить | Цитировать Сообщить модератору
 Re: Создание триггера запрещающего повторную запись  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7392
sonory,

триггер тут каким боком? Требуется создать ограничение уникальности.
27 авг 18, 13:30    [21654948]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить