sql - DB2 trigger timing out -


i have following trigger ensures 1 record has field defaultcard=1

create trigger trg_u_xstrdcrd      after update on xstoredcard referencing new n old o      each row mode db2sql      begin atomic         if n.defaultcard = 1             update xstoredcard                 set defaultcard = 0                 users_id = n.users_id , id <> n.id;         end if;      end@ 

i make sure 1 record has ebactive field value of 1, tried this.

create trigger trg_u_xstrdcrd      after update on xstoredcard referencing new n old o      each row mode db2sql      begin atomic         if n.defaultcard = 1             update xstoredcard                 set defaultcard = 0                 users_id = n.users_id , id <> n.id;         end if;         if n.ebactive = 1             update xstoredcard                 set ebactive = 0                 users_id = n.users_id , id <> n.id;         end if;      end@ 

but did not work, results on timeout after few minutes on update:

caused by: com.ibm.db2.jcc.b.sqlexception: db2 sql error: sqlcode: -101, sqlstate: 54001, sqlerrmc: null @ com.ibm.db2.jcc.b.zc.e(zc.java:1606) @ com.ibm.db2.jcc.b.zc.a(zc.java:1206) @ com.ibm.db2.jcc.a.db.h(db.java:149) @ com.ibm.db2.jcc.a.db.a(db.java:43) @ com.ibm.db2.jcc.a.r.a(r.java:30) @ com.ibm.db2.jcc.a.sb.g(sb.java:152) @ com.ibm.db2.jcc.b.zc.n(zc.java:1186) @ com.ibm.db2.jcc.b.ad.db(ad.java:1761) @ com.ibm.db2.jcc.b.ad.d(ad.java:2203) @ com.ibm.db2.jcc.b.ad.v(ad.java:521) @ com.ibm.db2.jcc.b.ad.executeupdate(ad.java:504) @ org.hibernate.persister.entity.abstractentitypersister.update(abstractentitypersister.java:2595) ... 19 more 

any advice on whats wrong or how it?

cheers! nfv

after reading this nice post, might have dawned on me few updates many. defined post update trigger, updates same table. update rows 1 user. let's have 10 rows per user , 1 row changed defaultcard flag. means update 9 rows regardless whether needed updated. doesn't sound big deal, however, if have 5,000,000 records, update 4,999,999 records though needed update 1 (namely old defaultcard record).

        update xstoredcard             set defaultcard = 0             users_id = n.users_id , defaultcard = 1 , id <> n.id; 

this statement should effect 1 or no record. instead of running 4,999,999 updates , trigger calls have 1 update.

the same true ebactive. better, if ebactive , defaultcard 1 different record, messy, since update ebactive trigger update defaultcard trigger update ebactive again. if not mistaken, in infinite loop.

 begin atomic     if n.defaultcard = 1         update xstoredcard             set defaultcard = 0             users_id = n.users_id , defaultcard = 1 , id <> n.id;     end if;     if n.ebactive = 1         update xstoredcard             set ebactive = 0             users_id = n.users_id , ebactive = 1 , id <> n.id;     end if;  end@ 

this should perform way better.

edit: second try

my should update dataset, if value changed.

 begin atomic     if n.defaultcard = 1 , o.defaultcard != 1         update xstoredcard             set defaultcard = 0             users_id = n.users_id , defaultcard = 1 , id <> n.id;     end if;     if n.ebactive = 1 , o.ebactive !=1         update xstoredcard             set ebactive = 0             users_id = n.users_id , ebactive = 1 , id <> n.id;     end if;  end@ 

Comments

Popular posts from this blog

c++ - CryptStringToBinary API behavior -

c++ - Correct method for redrawing a layered window -

java.util.scanner - How to read and add only numbers to array from a text file -