Неверное обновление данных при выполнении триггера Sybase

У меня есть стол test_123 с колонкой как:

int_1         (int), 
datetime_1    (datetime), 
tinyint_1     (tinyint), 
datetime_2    (datetime)

Так, когда столбец datetime_1 обновляется и значение в столбце tinyint_1 = 1 тогда мне нужно обновить мой столбец datetime_2 со значением столбца datetime_1

Я создал ниже триггер для этого.. но с моим триггером он обновляет все datetime2 значения столбца с datetime_1 столбец, когда tinyint_1 = 1 .. но я просто хочу обновить эту конкретную строку, где datetime_1 значение обновлено (я имею в виду изменилось)..

Ниже спусковой крючок..

CREATE TRIGGER test_trigger_upd
ON test_123 

FOR UPDATE
AS
FOR EACH STATEMENT 
IF UPDATE(datetime_1) 

BEGIN


UPDATE test_123 
SET test_123.datetime_2  = inserted.datetime_1                     
WHERE test_123.tinyint_1 = 1

END

1 ответ

Триггеры уровня ROW не поддерживаются в ASE. Есть только триггеры после оператора.

Как отмечалось ранее, проблема, с которой вы сталкиваетесь, заключается в том, что вам нужно иметь возможность связать строки в "вставленной" псевдотаблице с самой базовой таблицей. Вы можете сделать это только при наличии ключевого значения: столбца, который уникально идентифицирует строку, или комбинации столбцов, которая делает это. Без этого вы просто не сможете идентифицировать строку, которую нужно обновить, поскольку может быть несколько строк с одинаковыми значениями столбцов, если уникальность не гарантируется. (и примечание: отсутствие ключа в таблице - плохая практика проектирования - и эта проблема является одной из многих причин).

Простое решение - добавить столбец идентификаторов в таблицу, например:

ALTER TABLE test_123 ADD idcol INT IDENTITY NOT NULL

Затем вы можете добавить предикат 'test_123.idcol = inserted.idcol' к триггеру присоединиться.

Другие вопросы по тегам