Ни как не могу разобраться.
Выгружаю триггер через IBExpert из Firebird 1.0 в Firebird 2.0.6. Через создание скрипта, соответственно.
Возникает ошибка :
Код: Выделить всё
/*******************************************************************************
The next statement causes the following error:
can't format message 13:849 -- message system code -4.
attempted update of read-only column.
*******************************************************************************/
По этому, огромная просьба показать, где ошибка и что конкретно птице не нравится.
Код триггера:
Код: Выделить всё
CREATE OR ALTER TRIGGER IMP_DOC_AU FOR DOC
ACTIVE AFTER UPDATE POSITION 1
AS
DECLARE VARIABLE NewImpex INTEGER;
DECLARE VARIABLE p_id INTEGER;
DECLARE VARIABLE p_eid INTEGER;
DECLARE VARIABLE tmp INTEGER;
BEGIN
IF (GEN_ID(switch_replic, 0) = 1) THEN
BEGIN
IF (old.dimpex IS NULL) THEN old.dimpex = 0;
IF (old.dimpex <> 0) THEN
/* Если поменяли Склад, Нашу фирму, Счет/Касса/Сотрудник то необходимо высылать связанные записи,
т.к. в предыдущий экспорт это могло не уйти.
Меняем IMPEX... */
IF ((new.dconcept IN (6001, 6002, 6003, 6051, 6052, 6053, 6059, 6102, 6103, 6104, 6802, 6803, 6901, 6904, 6951, 6953) AND
((old.did2 <> new.did2) OR (old.did4 <> new.did4)))
OR
(new.dconcept IN (6801, 6601, 6203, 6204, 6401, 6402) AND
(old.did2 <> new.did2))
OR
(new.dconcept = 6101 AND
((old.did1 <> new.did1) OR (old.did4 <> new.did4) OR (old.did2 <> new.did2)))
OR
(new.dconcept in (6201, 6202) AND
((old.did2 <> new.did2) OR (old.did4 <> new.did4)))
OR
(new.dconcept = 6251 AND
((old.did2 <> new.did2) OR (old.did9 <> new.did9) OR (old.did1 <> new.did1) OR (old.did4 <> new.did4)))
) THEN
BEGIN
NewImpex = GEN_ID(genimpex, 0);
UPDATE lin SET eimpex = :NewImpex WHERE eiddoc = old.did OR eiddoc = -old.did;
UPDATE lina SET eimpexa = :NewImpex WHERE eiddoca = old.did OR eiddoca = -old.did;
UPDATE his SET himpex = :NewImpex WHERE hidrec = old.did;
UPDATE docstr SET simpex = :NewImpex WHERE sidlib = old.did;
UPDATE lnk SET iimpex = :NewImpex WHERE idid1 = old.did OR idid2 = old.did;
UPDATE lnka SET iimpexa = :NewImpex WHERE idid1a = old.did OR idid2a = old.did;
FOR
SELECT id FROM xstruct
WHERE flag = 2 AND node = 0 AND UPPER(tname) = 'DOC' AND UPPER(fname) = 'DID' AND shortcut <> 1
INTO :p_id
DO
BEGIN
UPDATE xecblob SET ximpex = :NewImpex WHERE global = old.did AND concept = :p_id;
UPDATE xecdate SET ximpex = :NewImpex WHERE global = old.did AND concept = :p_id;
UPDATE xecint SET ximpex = :NewImpex WHERE global = old.did AND concept = :p_id;
UPDATE xecnum SET ximpex = :NewImpex WHERE global = old.did AND concept = :p_id;
UPDATE xecvc80 SET ximpex = :NewImpex WHERE global = old.did AND concept = :p_id;
END
/* Также поменяем IMPEX на текущий у записей, связанных с LIN... */
FOR
SELECT eid FROM lin
WHERE eiddoc = old.did
INTO :p_eid
DO
BEGIN
UPDATE idn SET timpex = :NewImpex WHERE teid1 = :p_eid OR teid2 = :p_eid;
UPDATE rma SET rimpex = :NewImpex WHERE reid1 = :p_eid OR reid2 = :p_eid;
FOR
SELECT id FROM xstruct
WHERE flag = 2 AND node = 0 AND UPPER(tname) = 'LIN' AND UPPER(fname) = 'EID' AND shortcut <> 1
INTO :p_id
DO
BEGIN
UPDATE xecblob SET ximpex = :NewImpex WHERE global = :p_eid AND concept = :p_id;
UPDATE xecdate SET ximpex = :NewImpex WHERE global = :p_eid AND concept = :p_id;
UPDATE xecint SET ximpex = :NewImpex WHERE global = :p_eid AND concept = :p_id;
UPDATE xecnum SET ximpex = :NewImpex WHERE global = :p_eid AND concept = :p_id;
UPDATE xecvc80 SET ximpex = :NewImpex WHERE global = :p_eid AND concept = :p_id;
END
END /* LIN */
/* Вставим в DEL команду на удаление - если документ не придет на УБД, например, по
причине того что сменили склад, то он там удалиться, а если придет в этом пакете,
то команда проигнорируется. */
INSERT INTO del (DelID, DelTable, DelRecord) VALUES (GEN_ID(gendel, 1), 'DOC', old.did);
END
END
END
;
OS: CentOS 5.3 Final x32
Server: Firebird CS 2.0.6
Миграция UDF и isc4.gdb -> security2.fdb сделана.
Заранее спасибо тем кто откликнется!