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

Откуда:
Сообщений: 4
написала вот такой триггер, не позволяющий вводить отрицательную цену. не отрабатывает.. что не так?
create trigger primer2 on test
instead of insert, update as begin
SET NOCOUNT ON
if @@rowcount=0 return ;
if (update(price)) and (select min(price) from iserted)< 0 begin 
--raiserror (' Price must be >= 0',16,10)
print ('atat!!')
rollback tran
return
end end
go

begin tran 
insert into test values ('bbb','v fxdv',1,0)
if @@TRANCOUNT>0 rollback tran 
18 ноя 11, 20:57    [11623265]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Partizan4ek,

if (update(price)) and (select min(price) from iserted)< 0 begin
оно работает??
кстати
11204238
18 ноя 11, 21:09    [11623320]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Partizan4ek,

1. как переводится "instead of insert"? Отсюда ясно, почему "не отрабатывает".
2. ничего в БД внутри этого триггера произойти не может - зачем ROLLBACK?
3. BEGIN и END - лишние (но это мелочь)
4. @@ROWCOUNT будет глючить в MERGE
5. что, по-Вашему, делает функция UPDATE()? Абсолютно бесполезная приблуда.
18 ноя 11, 21:16    [11623350]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
Partizan4ek
Member

Откуда:
Сообщений: 4
iap,
п.1, да, не заметила
п.2-5 делала по примеру из книги кена хендерсона, также неясен смысл апдейта.
т.е. убрать роллбек, вернуть raiserror, поменять intead of на for. так?
18 ноя 11, 22:37    [11623713]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
invm
Member

Откуда: Москва
Сообщений: 9844
Partizan4ek
написала вот такой триггер, не позволяющий вводить отрицательную цену. не отрабатывает.. что не так?
create trigger primer2 on test
instead of insert, update as begin
SET NOCOUNT ON
if @@rowcount=0 return ;
if (update(price)) and (select min(price) from iserted)< 0 begin 
--raiserror (' Price must be >= 0',16,10)
print ('atat!!')
rollback tran
return
end end
go

begin tran 
insert into test values ('bbb','v fxdv',1,0)
if @@TRANCOUNT>0 rollback tran 

В данном случае @@rowcount будет всегда равно нулю. На этом выполнение триггера благополучно закончится.
iap
5. что, по-Вашему, делает функция UPDATE()? Абсолютно бесполезная приблуда.
Я бы не был столь категоричен.
19 ноя 11, 00:04    [11624120]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
aleks2
Guest
Мне одному кажется, что CONSTRAINT был бы проще и правильнее?
19 ноя 11, 07:07    [11624563]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по триггеру  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
aleks2
Мне одному кажется, что CONSTRAINT был бы проще и правильнее?

+1
19 ноя 11, 10:54    [11624681]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить