А в этом оракле можно сделать триггер на UPDATE записи, который бы изменял поле в этой же самой записи?
Нормальным способом вложенный UPDATE из триггера не работает, получается deadlock. Autonomous transaction не помогает.
Это вообще возможно? Если да, то как? Если нет, то как это обойти?
В MSSQL оно замечательно работало.
Upd: уточненная задача выглядит так: в таблице есть вычисляемое поле, значение которого зависит от других полей _этой же записи_. Хочется возложить задачу вычисления этого поля на сервер путем триггера, срабатывающего на UPDATE. Так бывает?
Нормальным способом вложенный UPDATE из триггера не работает, получается deadlock. Autonomous transaction не помогает.
Это вообще возможно? Если да, то как? Если нет, то как это обойти?
В MSSQL оно замечательно работало.
Upd: уточненная задача выглядит так: в таблице есть вычисляемое поле, значение которого зависит от других полей _этой же записи_. Хочется возложить задачу вычисления этого поля на сервер путем триггера, срабатывающего на UPDATE. Так бывает?
no subject
А я так понимаю, что это тот вопрос, который ты задавал вчера по аське? Если так - то там есть существенное уточнение: второй апдейт проводится по результатам функции, работающей на изменяемой в данный момент таблице. То есть - мутация, сразу и обязательно. И красивого универсального способа это обойти - я, честно говоря, за сутки так и не придумал.
no subject
Там изнутри апдейта вызывался селект, если этот селект завернуть в автономную транзакцию, то всё хорошо.
А здесь накладываются два апдейта, так уже не обойдешь.
Задача такая: есть поле, значение которого зависит от двух других полей в этой же записи (на самом деле, оно еще может зависеть от других записей, но это уже не актуально, см. выше).
Хочется задачу вычисления этого поля возложить на сервер, а не на клиента. Чтоб при изменении одного из тех двух полей третье вычислялось само. Иначе нафига вообще нужны триггеры?
no subject
no subject
Проблема в том, что если я изнутри триггера, повешенного на апдейт, вызываю апдейт этой же записи, то наступает deadlock.
Если из триггера вызывать апдейт других записей в этой же таблице, то все нормально, я пробовал, а вот на текущую - никак не получается :(
no subject
Ну сам посуди: ты апдейтишь запись (Оракл ее, естественно, блокирует с началом транзакции), срабатывает триггер, в котором та же запись опять апдейтится... вызывая повторное срабатывание триггера на апдейт! Ну, и как, спрашивается, Оракл должен разблокировать запись в условиях бесконечного вызова одного и того же триггера?! А никак. Вот тебе и deadlock, вполне законный.
no subject
no subject
no subject
no subject
no subject
Или имеется в виду список полей, при изменении которых срабатывает триггер? Если так, то именно туда
no subject
CREATE OR REPLACE TRIGGER orders_before_update
BEFORE UPDATE
ON orders
FOR EACH ROW
DECLARE
v_username varchar2(10);
BEGIN
-- Find username of person performing UPDATE on the table
SELECT user INTO v_username
FROM dual;
-- Update updated_date field to current system date
:new.updated_date := sysdate;
-- Update updated_by field to the username of the person performing the UPDATE
:new.updated_by := v_username;
END;
no subject
Спасибо, завтра буду проверять. А то уже поздно, с работы выгоняют ;)
no subject
jfui, оракл живьем я видел лет пять назад, а сейчас в гугле набрал
before update trigger oracle (http://www.google.ru/search?q=before+update+trigger+oracle&sourceid=mozilla-search&start=0&start=0&ie=utf-8&oe=utf-8&client=firefox&rls=org.mozilla:en-US:unofficial) и открыл вторую ссылку из результатов (http://www.techonthenet.com/oracle/triggers/before_update.php) :)
no subject
no subject
Вот что значит давно уже
переквалифицироваться в управдомыперестать заниматься разработкой и уйти в админоиды... :))no subject