RE: [CDBI] Re: Disabling cascading before_update/after_update triggers

"Andrew O'Brien" <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.class-dbi
Message-ID <[email protected]>
> Andrew O'Brien wrote:
> > I had to extend the disabling triggers example on
> > http://wiki.class-dbi.com/wiki/Working_with_triggers to 
> allow me to only
> > disable the after_update trigger while I was in the 
> function call - all
> > other triggers had to remain functional.
> 
> I like what you did here, but isn't it unnecessary to disable 
> after_update triggers if you use __attribute_set() or
> __attribute_store() instead of set() in your trigger? That's
> what that wiki page says, right? I'm by no means a CDBI
> trigger expert...

Unfortunately not. The wiki doesn't really make sense in this case. From
the docs on _attribute_set:

"Updates values in the object via _attribute_store(), but also logs the
changes so that they are propagated to the database with the next
update. (Unlike set(), however, _attribute_set() will not trigger an
update if autoupdate is turned on.)"

So the sequence:

$o = Class->retrieve( $id );
$o->time();        # 60
$o->skill_level(); # 1.0
$o->total_time();  # 60
$o->skill_level( 1.5 );
$o->total_time;    # value of 90, as you would expect
$o->discard_changes;
$o->total_time;    # 60!

...will result in the class data being up to date but the data isn't
written through to the database. Autoupdate is on so the programmer's
assumption is that if a field is updated then it (and by extension any
derived fields via the trigger) are set in the DB.

A subsequent ->update will, of course, fix this but that is
counterintuitive as you only have to call ->update after making changes
to some columns but not others.

Easier to enforce the update by doing set() which also has the effect of
allowing all other constraint / whatever triggers to fire as normal for
the updated fields.

> > Is this useful to anyone and worth adding to the wiki?
> 
> Certainly! Concrete examples like this are very much worth 
> adding to the
> wiki.

Will do.

Cheers,

Andrew
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.