November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Wednesday, October 5th, 2005 05:37 pm
А в этом оракле можно сделать триггер на UPDATE записи, который бы изменял поле в этой же самой записи?
Нормальным способом вложенный UPDATE из триггера не работает, получается deadlock. Autonomous transaction не помогает.

Это вообще возможно? Если да, то как? Если нет, то как это обойти?
В MSSQL оно замечательно работало.

Upd: уточненная задача выглядит так: в таблице есть вычисляемое поле, значение которого зависит от других полей _этой же записи_. Хочется возложить задачу вычисления этого поля на сервер путем триггера, срабатывающего на UPDATE. Так бывает?
Tags:
Wednesday, October 5th, 2005 05:53 pm (UTC)
вроде как при триггере before update там есть набор значений in и набор значений out, и этот out можно менять.
Wednesday, October 5th, 2005 05:57 pm (UTC)
В смысле - in и out? Триггер может вообще ничего не принимать и ничего не возвращать - это же не функция...
Или имеется в виду список полей, при изменении которых срабатывает триггер? Если так, то именно туда [livejournal.com profile] dil и копает как раз сейчас :). Ибо логика схемы там такая, что застрелиться можно :).
Wednesday, October 5th, 2005 06:01 pm (UTC)


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;
Wednesday, October 5th, 2005 06:11 pm (UTC)
О, это, кажется, оно.
Спасибо, завтра буду проверять. А то уже поздно, с работы выгоняют ;)
Wednesday, October 5th, 2005 06:15 pm (UTC)
сударь, вы меня удивляете :)
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) :)
Thursday, October 6th, 2005 09:18 am (UTC)
(шепотом) а я его впервые увидел две недели назад. Мне его выдали, и сказали, что вот эта программа, которая раньше работала с вот этой базой на MSSQL, должна работать с этой же базой, но на оракле. Потому что заказчик так хочет. Причем, как всегда, уже вчера ;)
Wednesday, October 5th, 2005 06:33 pm (UTC)
Тьфу ты :). Ну конечно же - использование :new и :old!
Вот что значит давно уже переквалифицироваться в управдомы перестать заниматься разработкой и уйти в админоиды... :))
Thursday, October 6th, 2005 04:46 pm (UTC)
Вах! Работает, спасибо. Пойду приделывать то же ссамое на insert, а то оно что-то не работает