Триггеры в MS SQL 7.0 & IB

Delmi
Дата: 26.10.2000 11:51:45
Подскажите пожалуйста !
В IB 5.0 в триггерах существуют параметры new и old
Насколько мне известно ,их аналогами в MS SQL 7.0 являются inserted и deleted
Вопрос заключается в том , каким образом они связаны и в чем их отличие.
каким образом в MS SQL 7.0 можно написать такой триггер:

CREATE TRIGGER NNN FOR NNN1
ACTIVE AFTER UPDATE POSITION 0
AS
DECLARE VARIABLE CNT INTEGER;
BEGIN
IF (NEW.IDX IS NOT NULL) THEN
BEGIN
SELECT COUNT(IDX) FROM ADRES
WHERE (ADRES.IDX=NEW.IDX) INTO :CNT;

UPDATE ADRES SET
TMP_OBL=NEW.TMP_OBL,
TMP_RAION=NEW.TMP_RAION,
NAS=NEW.NAS,
NAZV=NEW.NAZV
WHERE ADRES.IDX=NEW.IDX;
END
END

Заранее благодарен !
SergSuper
Дата: 26.10.2000 13:23:00
Триггер всегда вызывается после. inserted и deleted - псевдотаблицы, в которых как бы копируются записи соответственно новые и старые. Абстрактно они никак не связаные - если нет ключей то непонятно что же вставилось и что удалилось. Поэтому для таблицы у которой есть триггер должны быть какие-то ключевые поля. Только по ним и можно узнать что же изменилось.

Я несколько не понял что делается в приведенном триггере. Буду считать что он написан для таблицы NNN1. Что такое POSITION 0 не знаю и буду игнорировать. Так же непонятно зачем вычисляется CNT, которое не используется. В остальном я бы написал так:

CREATE TRIGGER NNN ON NNN1
for UPDATE
AS
DECLARE @CNT INT;
BEGIN
IF exists(select * from inserted) THEN
BEGIN
SELECT @CNT=COUNT(IDX) FROM ADRES, inserted NEW
WHERE ADRES.IDX=NEW.IDX

UPDATE ADRES SET
TMP_OBL=NEW.TMP_OBL,
TMP_RAION=NEW.TMP_RAION,
NAS=NEW.NAS,
NAZV=NEW.NAZV
from inserted NEW
WHERE ADRES.IDX=NEW.IDX;
END
END

Я использовал NEW как алиас чтобы меньше было исправлять.

С приветом Сергей
SergSuper
Дата: 26.10.2000 13:24:45
Пардон - еще надо убрать ";"
Delmy
Дата: 27.10.2000 13:26:10
sorry , там между where и update еще вставка:
IF ( :CNT = 0 ) THEN
INSERT INTO ADRES(IDX,TMP_OBL,TMP_RAION,NAS,NAZV)
VALUES(NEW.IDX,NEW.TMP_OBL,NEW.TMP_RAION,NEW.NAS,NEW.NAZV);
Delmi
Дата: 27.10.2000 13:31:14
Как это можно перевести ?
SergSuper
Дата: 27.10.2000 14:35:32
Ну очевидно

IF ( @CNT = 0 )
INSERT INTO ADRES(IDX,TMP_OBL,TMP_RAION,NAS,NAZV)
SELECT NEW.IDX,NEW.TMP_OBL,NEW.TMP_RAION,NEW.NAS,NEW.NAZV
FROM inserted NEW

INSERT с использованием VALUES позволяет вставлять только одну строку, поэтому используется INSERT ... SELECT.
Delmi
Дата: 29.10.2000 12:22:36
Большое спасибо ! теперь это понятно.
А как быть с таким коротким триггером ?
CREATE TRIGGER D FOR D1
ACTIVE BEFORE UPDATE POSITION 0
AS
BEGIN
NEW.A3 ="01/01/1991"; /* Непонятно как в inserted можно сделать запись... */
END
SergSuper
Дата: 30.10.2000 09:34:14
В inserted сделать записть нельзя, к тому же это совершенно не нужно. Я уже писал, что это таблица в которой только показано, что стало нового. Непосредственно с изменяемой таблицей она никак не связана. Чтобы проапдейтить основную таблицу, надо её как-то связать с основной

update TBL
set Fld='01/01/99'
from TBL t, inserted i
where t.KeyFld=i.KeyFld
Andrei_A
Дата: 29.04.2003 16:20:08
Тоды подскажите. Если сам из INSERTED значение апдейтишь в тригере бефоре апдейт, то они сами потом никуда не пытаются вставиться????....

Триггер всегда вызывается после. inserted и deleted - псевдотаблицы, в которых как бы копируются записи соответственно новые и старые. Абстрактно они никак не связаные - если нет ключей то непонятно что же вставилось и что удалилось. Поэтому для таблицы у которой есть триггер должны быть какие-то ключевые поля.

А сколько записей в ней может быть??? Когда они там чистятся??
SergSuper
Дата: 29.04.2003 16:47:07
Я это писал почти три года назад, когда before триггеров не было :)
Но всё равно: INSERTED - это псевдотаблица и смысла модифицировать её нет.
Кстати триггеров "До"(before) нет и сейчас, есть триггеры "вместо" (instead).
Записей в таблице INSERTED ровно столько сколько проапдейтилось записей в основной таблице. Исчезнет она, когда триггер закончит работу.