Привет, IT-сообщество. Помогите разобраться с правильным созданием триггеров в этих двух задачах:
Триггер не позволяющий удалять диски группы The Beatles
Я попытался написать, но оно не работает вообще. Ничего не удаляется, если диск не попадает в условия. Перепробовал почти все, но никак. Может это как то связано с внешним ключом?
create trigger tg_beatles_delete_taboo on Discs
instead of delete
as
begin
declare @id int
select @id=SingerId from inserted
if exists(select SingerId from Discs d
join Singers s on s.Id=d.SingerId
where SingerId=@id and s.Name=N'The Beatles')
begin
print ('Sorry, you can not delete discs of this group')
rollback transaction
end
else
begin
delete from Discs
where exists (select SingerId from Discs d
join Singers s on s.Id=d.SingerId
where SingerId=@id)
end
end
И вторая задача для другой бд
При удалении информации о покупателе триггер переносит
его историю покупок в таблицу «История покупок»
Тут вылетает ошибка, связанная со ссылочным ограничением
create trigger tg_purchase_history on Clients
instead of delete
as
begin
insert into PurchaseHistory(EmpId,ClientId,Product,Price,SDate)
select EmpId,ClientId,Product,Price,SDate
from SaleOfGoods sg join deleted d
on d.Id=sg.ClientId
delete from Clients
where Id in (select Id from deleted)
end
Блин, точно. Спасибо) Осталось понять, что во втором не так
Вот такая ошибка выскакивает:
Msg 547, Level 16, State 0, Procedure tg_purchase_history, Line 11 [Batch Start Line 68]
The DELETE statement conflicted with the REFERENCE constraint “FK__PurchaseH__Clien__47DBAE45”. The conflict occurred in database “Sales_db”, table “dbo.PurchaseHistory”, column ‘ClientId’
Я уже и сам не знаю. Как сделать так, чтобы нормально записывались данные в историю с одной таблицы при удалении из другой. Ну уберу я клиента из истории, разве это поможет?
Сделал таким образом: добавил в таблицу клиентов еще один столбец “Примечания” и вместо удаления добавляю туда запись, что “Его песенка спета”. Ничего умнее придумать не смог. А так все работает.