what fired a trigger - Mailing list pgsql-general

From Ivan Sergio Borgonovo
Subject what fired a trigger
Date
Msg-id 20060905225314.4253d5bd@localhost
Whole thread Raw
Responses Re: what fired a trigger  (Ivan Sergio Borgonovo <mail@webthatworks.it>)
List pgsql-general
Hi,

The most general problem that may be a design problem (and I'm not asking to do my homework even if well, you may still
help<g>) is I've a "temporary relation" and a permanent relation. 
A typical situation is the one of session in a web app and temporary basket. Once the user log in, the temporary basket
becomes"permanent". 
But I'd like automatic garbage collection for all tables simply related to sessions.
When a session get deleted all row that are *just* related to the session, but not to the user, should be deleted.
Anyway I still need normal "User related" delete.

The partial solution I found need to distinguish what fired a trigger another trigger or a "plain delete" and pass it
onto the other triggers. 

I've something similar:

create table T_Session (
    idSession char(32) not null default md5(now() || random())
)
alter table T_Session
    add constraint PK_Session
    primary key (idSession)
;

create table T_User (
    idUser integer
,    idSession char(32) --should stay here or in a t_Session_User(idSession,idUser)?
);

alter table T_User
    add constraint PK_User
    primary key (idUser)
;

create table T_Preferences (
    idPreferences integer
,    idSession char(32)
);
alter table t_Preferences
    add constraint PK_Preferences
    primary key (idPreferences)
;
alter table t_Preferences
    add constraint FK_Preferences_Session
    foreign key (idSession)
    references t_Session (idSession)
    on delete cascade
;
alter table t_Preferences
    add constraint FK_Preferences_User
    foreign key (idUser)
    references t_User (idUser)
    on delete cascade
;

create table t_Preferences_Stuff (
    idStuff integer
,    idPreferences integer
);
alter table T_Preferences_Stuff
    add constraint PK_Preferences_Stuff
    primary key (idStuff)
;
alter table T_Preferences_Stuff
    add constraint FK_Preferences_Stuff
    foreign key (idPreferences)
    references T_Preferences (idPreferences)
    on delete cascade
;

create or replace function TG_SessionDelete(
)
    returns trigger as '
    begin
        if OLD.idUser is not null then
            return null;
        else
            return OLD;
        end if;
    end;
' language plpgsql;


create trigger TG_SessionDelete before delete on T_Preferences
    for each row execute procedure TG_SessionDelete();

Now if I delete a session with something like
delete from t_Session where idSession='..........';
all the row in the linked tables where the idUser is null should be deleted.
If the row has a not null idUser it shouldn't be deleted.
And this works.

But what if I'd like to obtain those behaviour too:
1)
delete from T_Preferences where idSession='....';
should delete all row in linked tables, no matter if idUser is null or not
I'm still thinking if this is actually what I want since if there is a link to idUser I may use idUser to delete rows.
So I could split deletion related to session operations and deletion related to user operations.
2)
delete from T_User where idUser=10;
delete from T_Preferences where idUser=37;
should delete all row in linked tables.
the above trigger doesn't work.

I've tried to understand if there is a way to exploit TG_ARGV[] & Co. but I didn't understand even how to use it.

BTW postgres is 7.4.13


thx

--
Ivan Sergio Borgonovo
http://www.webthatworks.it


pgsql-general by date:

Previous
From: Ron Johnson
Date:
Subject: Re: [OT] sig sizes (was Re: Porting from ...)
Next
From: "Frank Church"
Date:
Subject: Re: Syntax for converting double to a timestamp