Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Тригеры в MSSQL 2000   Найти похожие ветки 

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

Помогите дураку! В 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 --  тоже ругается :(


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

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


 
Val ©   (2005-09-23 11:53) [2]

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


 
ANB ©   (2005-09-23 11:59) [3]


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


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

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


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

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


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


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


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


 
Bless ©   (2005-09-23 12:13) [7]

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


 
Bless ©   (2005-09-23 12:29) [8]

Соврал, сказав "никак".
Я не знаю, как называется ключевое поле у таблицы 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)


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


 
Stanislav ©   (2005-09-23 12:45) [9]

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


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

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


 
Stanislav ©   (2005-09-23 12:55) [11]

INSTEAD OF  UPDATE - ДО!



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
14-1128796474
mmms
2005-10-08 22:34
2005.11.06
Примечание для программистов.


2-1129023469
romas
2005-10-11 13:37
2005.11.06
новые технологии в БД


1-1129192785
Friend
2005-10-13 12:39
2005.11.06
Pos в RichEdit


11-1110074904
серый мЫш
2005-03-06 05:08
2005.11.06
TKOLMainMenu


1-1129056327
romychk
2005-10-11 22:45
2005.11.06
Image и StringGrid