Re: oid in plpgsql trigger

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: oid in plpgsql trigger
Дата
Msg-id 12215.1011417554@sss.pgh.pa.us
обсуждение исходный текст
Ответ на oid in plpgsql trigger  (chester c young <chestercyoung@yahoo.com>)
Список pgsql-sql
chester c young <chestercyoung@yahoo.com> writes:
> Is there any way to get the current record's oid in a plpgsql trigger?
> In a before insert trigger the oid might not make any sense if the oid
> has not yet have been assigned, but it makes sense elsewhere.

Indeed the OID hasn't been assigned yet in a BEFORE INSERT trigger.

7.1 plpgsql doesn't have support for accessing any system columns, OID
or the others.  But it works about like you'd expect in 7.2:

regression=# CREATE FUNCTION show_oid() RETURNS OPAQUE AS '
regression'# BEGIN
regression'# RAISE NOTICE ''oid is %'', NEW.oid;
regression'# RETURN NEW;
regression'# END;' LANGUAGE 'plpgsql';
CREATE
regression=# create table foo (f1 int);
CREATE
regression=# CREATE TRIGGER before_oid BEFORE INSERT ON foo
regression-# FOR EACH ROW EXECUTE PROCEDURE show_oid();
CREATE
regression=# insert into foo values(11);
NOTICE:  oid is 0
INSERT 139803 1
regression=# CREATE TRIGGER after_oid AFTER INSERT ON foo
regression-# FOR EACH ROW EXECUTE PROCEDURE show_oid();
CREATE
regression=# insert into foo values(22);
NOTICE:  oid is 0
NOTICE:  oid is 139805
INSERT 139805 1

What might surprise you is OID's not set yet in a BEFORE UPDATE
trigger, either:

regression=# CREATE TRIGGER before_update_oid BEFORE UPDATE ON foo
regression-# FOR EACH ROW EXECUTE PROCEDURE show_oid();
CREATE
regression=# update foo set f1 = f1 + 1;
NOTICE:  oid is 0
NOTICE:  oid is 0
UPDATE 2
regression=# CREATE TRIGGER after_update_oid AFTER UPDATE ON foo
regression-# FOR EACH ROW EXECUTE PROCEDURE show_oid();
CREATE
regression=# update foo set f1 = f1 + 1;
NOTICE:  oid is 0
NOTICE:  oid is 0
NOTICE:  oid is 139803
NOTICE:  oid is 139805
UPDATE 2

However the problem here is we are looking at NEW.oid, which is the
row-under-construction and behaves much like a row being inserted.
If we looked at OLD.oid, it'd be set correctly in both UPDATE triggers.

Likewise, in a DELETE trigger, OLD.oid is valid either BEFORE or AFTER.
        regards, tom lane


В списке pgsql-sql по дате отправления:

Предыдущее
От: chester c young
Дата:
Сообщение: oid in plpgsql trigger
Следующее
От: Murray Prior Hobbs
Дата:
Сообщение: Re: pltlc and pltlcu problems