некорректное обновление данных при выполнении триггера 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

person Arpan    schedule 20.01.2015    source источник
comment
Похоже, что ваше предложение where может быть проблемой. Я бы добавил ключевой столбец, чтобы вы могли убедиться, что обновляете только одну строку за раз.   -  person Michael Gardner    schedule 21.01.2015
comment
я не могу добавить сюда дополнительный столбец .. я имею в виду, что триггер не может иметь входной параметр. Нет ли в sybase ничего, где мы могли бы сделать инструкцию FOR EACH ROW? Потому что, когда я пытаюсь это сделать, это дает мне ошибку компиляции   -  person Arpan    schedule 22.01.2015
comment
Извините, я имел в виду добавить столбец в таблицу при его создании - до создания/выполнения вашего триггера. Роб В. — один из самых знающих людей в мире, когда речь заходит о продуктах Sybase db, так что его ответ, вероятно, правильный.   -  person Michael Gardner    schedule 22.01.2015


Ответы (1)


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

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

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

ALTER TABLE test_123 ADD idcol INT IDENTITY NOT NULL

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

person RobV    schedule 22.01.2015