Thread: How do I access the current row from a trigger?

How do I access the current row from a trigger?

From
Magnus Sjöstrand
Date:
Hi,

I have a table as:
create table sections (    id           serial not null primary key,    parent_id    references sections(id)
);

there is only one row where the parent_id is NULL, and that is the root 
section, all others refers to a section. Now I want to create a trigger, 
so that whenever I delete a section I can delete all sections that has 
the deleted section as parent, which in turn will run the triggers for 
the deleted sections. Thus I will be able to clear an entire branch with 
only one SQL command from the client.

consider the content:
id          parent_id
0           NULL
1           0
2           1
3           2

and when I run the command
delete from sections where id=1;

I want this to trigger a function which will do
delete from sections where parent_id=( 'id' field in the current row[1] )

which in turn will trigger the same function to do
delete from sections where parent_id=( 'id' field in the current row[2] )

is there any way to do this in PostgreSQL? I couldn't find a way of 
refering to the current row in a trigger in the postgresql reference.

Sincerely,
/Magnus Sjöstrand





Re: How do I access the current row from a trigger?

From
Stephan Szabo
Date:
On Wed, 3 Jul 2002, [ISO-8859-1] Magnus Sj�strand wrote:

> Hi,
>
> I have a table as:
> create table sections (
>      id           serial not null primary key,
>      parent_id    references sections(id)
> );
>
> there is only one row where the parent_id is NULL, and that is the root
> section, all others refers to a section. Now I want to create a trigger,
> so that whenever I delete a section I can delete all sections that has
> the deleted section as parent, which in turn will run the triggers for
> the deleted sections. Thus I will be able to clear an entire branch with
> only one SQL command from the client.

How about just adding ON DELETE CASCADE to the references constraint?

But that doesn't answer the general question about access, so...

> is there any way to do this in PostgreSQL? I couldn't find a way of
> refering to the current row in a trigger in the postgresql reference.

I believe it's somewhat dependant on the procedural language used
to define the trigger function.  In plpgsql, you should be able to use OLD
and NEW to get column values like OLD.id in the case of an after delete
trigger.