Qairat
@Qairat
frontend developer, angular 2+

Как правильно создать триггер в MS SQL?

Всем привет!
Есть два таблицы:
table1(Id, BIN) и table2(Id, t1_Id, BIN)
Мне надо при insert в table2 проверить BIN. Если есть такой в первом таблице(table1),
то тогда пишу его Id в таблицу2(table2) в поле t1_Id.
Вот мой код:
go
alter trigger hello on dbo.Employees
after insert
as
declare @newBin bigint;
declare @t1_id bigint;
begin
	select @newBin = BIN from inserted i;
	select @t1_id = (select t.Id from table1 t where t.BIN = @newBin);
        if(@t1_id!=' ')
        begin
	update table2 set t1_id=@t1_id;
        end
end
go

Все работает, есть один но. При обновлении таблицы, он обновляет все поля t1_id.
А надо обновить только добавленную. Как сделать?
  • Вопрос задан
  • 207 просмотров
Пригласить эксперта
Ответы на вопрос 3
@d-stream
Готовые решения - не подаю, но...
if updated(имя_поля)

ну и стоит иметь в виду, что в общем случае в inserted может оказаться более одной записи, поэтому общая канва должна быть наподобии вот такой:
declare cur_trigger cursor for select ... from inserted 
open cur_trigger
fetch cur_trigger into @переменные 
while @@fetch_status=0 begin
              ... тут сами действия для одной из вставленных строк, включая проверки "измененности" и т.п.
               fetch cur_trigger into @переменные 
end 
close cur_trigger
deallocate cur_trigger


ну или по вкусу цикл по записям без курсора
Ответ написан
Комментировать
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
table1(Id, BIN) и table2(Id, t1_Id, BIN)
Создайте в table1(Id, BIN) уникальный индекс по BIN и добавляйте все записи table2.BIN.
Ответ написан
Комментировать
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
Начать надо с того, что триггер тут не нужен. Если же сделать еще и по первому варианту, что вам советовали - то это вообще кошмар, потому что там еще и курсор в триггере. Никогда не делайте курсор в триггере.
Второй вариант - меньший, но тоже кошмар.

"Критикуя - предлагай".

Предлагаю. Проверить, есть ли такая запись во второй таблице - надо с помощью простого foreign key. Т.е. надо просто таблицы связать, поле не должно быть NULL и больше НИЧЕГО, никакие триггера не городить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы