Неверное обновление данных при выполнении триггера 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'
к триггеру присоединиться.