Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Помогите разобратся в триггере


Автор: mingaraev 30.3.2011, 22:20
Доброго времени суток! У меня появилась следующая проблема - триггер не проверяет условие и всегда возвращяет одно и то же значение 
Код

USE [Biblioteka]
GO
ALTER TRIGGER Udalenie /*Триггер, который запрещает выписывать читателя из библиотеки, если у него на руках книги*/
ON Chitatel
FOR DELETE
AS
BEGIN
/*Объявление временной переменной для сохранения удаляемого читателя*/
DECLARE @Bilet varchar(50)
/*Получение значения удаляемого читателя*/
SELECT @Bilet=Deleted.Num_chit_bl
FROM Chitatel, Deleted
WHERE Chitatel.Num_chit_bl=Deleted.Num_chit_bl
/*Проверка, есть ли у читателя книги на руках*/
IF EXISTS (SELECT* FROM Vudacha
WHERE Num_chit_bl=@Bilet AND Data_vozvrat is null)
               BEGIN
                   ROLLBACK TRANSACTION
                   PRINT 'Нельзя удалить этого читателя, так как у него есть несданные книги.'
 
END
else 
PRINT 'Удален ' 
END
  
вот структурв таблиц
user posted image
вот еще насторожило при выполнении запроса 
Код
delete from Chitatel where Num_chit_bl='1006p'
(1006p-номер читательского билета, который попадает под условие  Data_vozvrat is not null, т.е. должен быть удален), на который должен откликнутся триггер не появляется значение
user posted image 
не могу понять почему все таки он не работает как следует. Буду благадарен за любую помощь.

Автор: Zloxa 30.3.2011, 22:37
Цитата(mingaraev @  30.3.2011,  22:20 Найти цитируемый пост)
SELECT @Bilet=Deleted.Num_chit_bl
FROM Chitatel, Deleted
WHERE Chitatel.Num_chit_bl=Deleted.Num_chit_bl

1) Если триггер у нас работает ПОСЛЕ того, как отработал стейтмент(команда delete), то что вы ожидаете получить соединяя множество удаленнх значением с множеством оставшихся?
2) Если триггер у вас отработает при выполнении запроса, удаляющего десять читателей, номер битлета какого из десяти читателей вы ожидаете увидить в переменной @Bilet в результате работы этой конструкции?

Автор: mingaraev 31.3.2011, 05:35
А как сделать что бы триггер нормально отрабатывал проверку и удаление? Удаление всегда происходит по одному читателю, а нескольким.

Автор: Zloxa 31.3.2011, 11:12
Цитата(mingaraev @  31.3.2011,  05:35 Найти цитируемый пост)
как 

я бы попрбовал так
Код

IF EXISTS (SELECT* FROM Vudacha v,deleted d
WHERE v.Num_chit_bl=d.Num_chit_bl AND v.Data_vozvrat is null)

но у меня есть сомнения. Мне кажется эта проверка, будучи реализованной в триггерной логике, в режиме конкурентной модификации, для некоторых уровней изоляции транзакций может давать сбои при определенных обстоятельствах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)