Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобратся в триггере 
:(
    Опции темы
mingaraev
Дата 30.3.2011, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2011

Репутация: нет
Всего: нет



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

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 
не могу понять почему все таки он не работает как следует. Буду благадарен за любую помощь.
PM MAIL   Вверх
Zloxa
Дата 30.3.2011, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(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 в результате работы этой конструкции?


Это сообщение отредактировал(а) Zloxa - 31.3.2011, 10:52


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
mingaraev
Дата 31.3.2011, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 30.3.2011

Репутация: нет
Всего: нет



А как сделать что бы триггер нормально отрабатывал проверку и удаление? Удаление всегда происходит по одному читателю, а нескольким.
PM MAIL   Вверх
Zloxa
Дата 31.3.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(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)

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0404 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.