Я хочу создать триггер в DB2 10.1.2 (LUW, работающий в Linux), который, когда поле обновляется до определенного значения, подсчитывает количество строк в этой таблице с этим значением, чтобы увидеть, он сопоставляет счет в другой таблице, а затем обновляется эта таблица (например, свертывание статуса задачи в статус задания). Выражая это казалось довольно легко:Блокировка триггерной строки DB2
CREATE TRIGGER AUTHORED
AFTER UPDATE OF TASK_STATUS ON TASK_TABLE
REFERENCING NEW AS N FOR EACH ROW WHEN (TASK_STATUS = 'Completed')
update JOB_TABLE set JOB_STATUS='Completed'
where JOB_TABLE.ID = N.JOB_ID
and JOB_TABLE.TOTAL_TASKS = (select count(*) from TASK_TABLE
where TASK_TABLE.JOB_ID = N.JOB_ID
and TASK_TABLE.TASK_STATUS = 'Completed')
К сожалению, кажется, что контекст триггера и тела триггера не в одной и той же единице работы и тупиковый происходит, когда вы подсчитывать строку запертую от сработавшего обновить себя. Вот выход «db2pd -wlocks» после того, как я сработавшее обновление:
Locks being waited on :
AppHandl [nod-index] TranHdl Lockname Type Mode Conv Sts CoorEDU AppName AuthID AppID
44248 [000-44248] 111 0200040E070000000000000052 RowLock ..X G 1385 perl KJPIRES 10.0.15.139.38727.140201011731
14937 [000-14937] 15 0200040E070000000000000052 RowLock .NS W 1238 perl KJPIRES 10.0.15.139.55287.140211231609
Я пытался использовать «с UR» для внутреннего счета, но это явно игнорируется при создании триггера ("SQL20159W The условие изоляции игнорируется из-за контекста оператора. SQLSTATE = 01652 ").
Я также пытался использовать ПЕРЕД и ВМЕСТО, но возникли проблемы.
Кажется, что это было бы что-то общее. Как обычно это обрабатывается?
Вы пробовали «для каждого заявления»? – AngocA
Я просто попробовал «для каждого утверждения», и он все еще зашел в тупик. (Я не уверен, что произойдет, если обновление обновит несколько строк, и я делаю «для каждого оператора» вместо «для каждой строки», но это все равно не работает.) – kjpires
Невозможно выполнить запуск триггера в отдельный UOW, как вы говорите, потому что тело триггера фактически скомпилировано в план оператора 'UPDATE', который вызывает запуск триггера. Как вы определяете, что существует тупик? – mustaccio