Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тригеры в MSSQL 2000 [D7, MSSQL]


Маленький мук ©   (2005-09-23 11:47:00) 

Помогите дураку! В FireBird есть простая и удобная конструкция - изменить в тригере значение вставляемого или изменяемого поля, если оно неверно
CREATE TRIGGER j_pu_BU0 FOR j_pu
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
 if (new.pu1_plan is null) then new.pu1_plan=0;
end

как анаогичное  я могу сделать в SQL2000 ?
CREATE TRIGGER [j_pu_bu] ON dbo.j_pu
FOR UPDATE
AS
declare @pu_plan float

 select @pu_plan=pu1_plan from inserted
 
 --if (@pu_plan is null) then
 --  inserted.pu1_plan=0

update INSERTED set pu1_plan=0 --  тоже ругается :(


Stanislav   (2005-09-23 12:55:00) [1]

INSTEAD OF  UPDATE - ДО!


Маленький мук   (2005-09-23 12:52:00) [2]

так... ёлки-палки! тригеры то оказывется срабатывают ПОСЛЕ вставки......  
я то думал - что сработают ДО ! Ну... в принципе - если полю допустить , что оно может иметь значение NULL - то всё работает, обнуляется..


Stanislav   (2005-09-23 12:45:00) [3]

Если нужно заменить значение делается так:
Вместо FOR UPDATE
INSTEAD OF  UPDATE
(ЭТО означает вместо) а дальше тебе нужно повести UPDATE  с учетом изменений.


Bless   (2005-09-23 12:29:00) [4]

Соврал, сказав "никак".
Я не знаю, как называется ключевое поле у таблицы j_pu, поэтому допущу, что оно называется nz.

CREATE TRIGGER [j_pu_bu] ON dbo.j_pu
FOR UPDATE
AS
update j_pu
SET pu_plan=ISNULL(pu_plan) WHERE nz IN (SELECT nz FROM inserted)


Хоть и не нравится мне это очень, но вроде бы (после беглой проверки на тестовом примере) работает.


Bless   (2005-09-23 12:13:00) [5]

Соврал, сейчас исправлюсь :) (хотя предложенный мной вариант имхо лучше)


Bless   (2005-09-23 12:12:00) [6]


> Маленький мук   (23.09.05 12:04) [5]
>
> Люди! вы увлеклись! напишите мне как значения обнулять :
> ))


Имхо, никак. Модификация таблиц inserted, deleted в триггерах запрещена.
Если тебе нужно чтоб в поле pu1_plan никогда не было NULL, поставь
в свойствах этого поля таблицы значение по умолчание = 0 и запрети null-значения для этого поля.


Маленький мук   (2005-09-23 12:04:00) [7]

Люди! вы увлеклись! напишите мне как значения обнулять :))


Маленький мук   (2005-09-23 12:00:00) [8]

И всё таки?? вопрос вполне конкретный... неужели только на клиенте такие проверки делать??


ANB   (2005-09-23 11:59:00) [9]


> Val ©   (23.09.05 11:53) [2]
- а в операторных триггерах в оракле изменяемые строки сами вообще никак не приезжают.
ЗЫ. - а к чему вопрос то ?


Val   (2005-09-23 11:53:00) [10]

>ANB ©   (23.09.05 11:51)
что насчет statement triggers? :)


ANB   (2005-09-23 11:51:00) [11]

В ФБ и оракле триггеры срабатывают на каждую строку изменяемых данных. А в мс скл в триггер приезжают сразу все строки в виде НД, т.е. inserted.pu1_plan явно некорректно. А вот по поводу update - надо смотреть в BOL.


Наверх

Титульная страница Поиск, карта сайта Написать письмо