Return-Path: X-Original-To: apmail-db-derby-user-archive@www.apache.org Delivered-To: apmail-db-derby-user-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id C1F7E11636 for ; Mon, 16 Jun 2014 12:48:20 +0000 (UTC) Received: (qmail 82707 invoked by uid 500); 16 Jun 2014 12:48:20 -0000 Delivered-To: apmail-db-derby-user-archive@db.apache.org Received: (qmail 82672 invoked by uid 500); 16 Jun 2014 12:48:20 -0000 Mailing-List: contact derby-user-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: List-Id: Reply-To: "Derby Discussion" Delivered-To: mailing list derby-user@db.apache.org Received: (qmail 82659 invoked by uid 99); 16 Jun 2014 12:48:20 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 16 Jun 2014 12:48:20 +0000 X-ASF-Spam-Status: No, hits=-2.3 required=5.0 tests=RCVD_IN_DNSWL_MED,SPF_PASS,UNPARSEABLE_RELAY X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of rick.hillegas@oracle.com designates 141.146.126.69 as permitted sender) Received: from [141.146.126.69] (HELO aserp1040.oracle.com) (141.146.126.69) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 16 Jun 2014 12:48:14 +0000 Received: from acsinet21.oracle.com (acsinet21.oracle.com [141.146.126.237]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s5GCln06017706 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 16 Jun 2014 12:47:49 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s5GClmdJ001282 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Mon, 16 Jun 2014 12:47:48 GMT Received: from abhmp0020.oracle.com (abhmp0020.oracle.com [141.146.116.26]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s5GClmif001271 for ; Mon, 16 Jun 2014 12:47:48 GMT Received: from Richards-MacBook-Pro.local (/10.159.84.241) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 16 Jun 2014 05:47:48 -0700 Message-ID: <539EE773.7020807@oracle.com> Date: Mon, 16 Jun 2014 05:47:47 -0700 From: Rick Hillegas User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.7; en-US; rv:1.9.2.18) Gecko/20110616 Thunderbird/3.1.11 MIME-Version: 1.0 To: derby-user@db.apache.org Subject: Re: trigger with cascade delete problem References: <53984E66.503@oracle.com> <5398EBE8.7050606@oracle.com> <5399C1AE.6040109@oracle.com> <539AF5C5.90808@oracle.com> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Source-IP: acsinet21.oracle.com [141.146.126.237] X-Virus-Checked: Checked by ClamAV on apache.org On 6/16/14 1:07 AM, Tim Dudgeon wrote: > On 13/06/2014 13:59, Rick Hillegas wrote: > >> Maybe >> you can share a simplified problem which shows why this aggregation is >> so tricky. >> >> Thanks, >> -Rick >> >> > > Hi Rick > > Thanks for your patience! > I've tried to create a minimal version that describes the problem: > > create table XXX ( > XXX_ID int primary key generated always as identity > ); > > create table GROUPING ( > GROUPING_ID int primary key generated always as identity, > XXX_ID INT, > constraint GROUPING2XXX foreign key (XXX_ID) references XXX > (XXX_ID) on delete cascade > ); > > create table MAIN ( > MAIN_ID INT generated always as identity, > GROUPING_ID INT, > YYY_ID INT, > NAME VARCHAR(50), > constraint MAIN2GROUPING foreign key (GROUPING_ID) references > GROUPING (GROUPING_ID) on delete cascade > ); > > create table AGGREGATES ( > AGGREGATES_ID int generated always as identity, > XXX_ID INT, > YYY_ID INT, > NAME VARCHAR(50) > ); > > > > The key parts is that AGGREGATES contains data that is grouped by > YYY_ID (from MAIN) and XXX_ID (from XXX/GROUPING). > So when a row from MAIN is deleted its CORRESPONDING row in AGGREGATE > needs updating, which I'm doing by doing a delete followed by an INSERT. > The row to delete is the one defined by the corresponding YYY_ID and > XXX_ID values. And to get the corresponding XXX_ID values I need to > join back to the GROUPING table. But in the case of a cascade delete > caused by deletion of a row in GROUPING the row I need to join on is > no longer present, as its just been deleted. > > And I can't do a cascade delete from GROUPING to AGGREGATES as that > would delete all AGGREGATES with the corresponding XXX_ID, not just > those with the correct XXX_IDs. > > I hope this is clearer! > > Tim > > > > > Hi Tim, I wonder if you could use a BEFORE trigger which buffers some result in memory for later use by your AFTER trigger. Something like this: create procedure PRECOMPUTE( grouping_id int ) language java parameter style java reads sql data external name 'zz.precompute'; -- precompute the result CREATE TRIGGER trg_beforedelete1 NO CASCADE BEFORE DELETE ON MAIN REFERENCING OLD ROW AS OLD FOR EACH ROW MODE DB2SQL CALL precompute( OLD.GROUPING_ID ); The deleted rows could even be buffered up in memory by a BEFORE trigger and then they could be wrapped by a table function for use in the join performed by the AFTER trigger. Disclaimer: I haven't tried this experiment. I'm just waving my hands. Hope this helps, -Rick