Hi George,
Sounds like you're working on an interesting problem. First a general
comment, then some detailed advice inline.
I'm not sure where you are in your design right now. At one point it
sounded as though you were going to collect changes via triggers, which
would call stored procedures. The stored procedures, in turn, would
populate a queue. And the queue would be implemented by some non-Derby
technology. This approach will have some interesting transactional
behavior. What happens if the original update fails and is rolled back?
If the failure happens after the trigger fires, then the stored
procedure will still be executed and a change will be queued up and
ultimately applied to your replicant. Now your original table and its
replicant are no longer in agreement. The solution suggested by John
English will not have this problem. In John's solution, the queue is
essentially implemented by a Derby table. The trigger will write to the
queue in the same nested transaction as the original change; if the
original change rolls back, the corresponding queue entry will roll back
too.
More comments inline...
On 3/23/14 2:22 PM, spykee wrote:
Hi,
> From my application tables ( for each table I have a trigger for INSERT,
UPDATE and DELETE operation), I will need two important information:
a) the columns names which changed when an update SQL occured.
b) the columns values that changed during an UPDATE SQL script.
The points a) + b) will be used to create a message to be sent on the
QUEUE.
But with Derby I encountered few "issues" .
1. Is not possible to fetch only the updated columns from an UPDATE trigger.
2. There is no way of fetching the columns name from a trigger(That's, I
want to know from an UPDATE trigger the updated columns names and to use
this information on building the message for my replication system)
Note that an update trigger can be defined with a column list. The
trigger only fires if a change is made to one of the columns in that
list. The following script shows how to record only the changed columns.
Hope this helps,
-Rick
connect 'jdbc:derby:memory:db;create=true';
create table original
(
primaryKey int generated always as identity primary key,
intCol int,
varcharCol varchar( 20 )
);
create table changeCollector
(
changeID int generated always as identity primary key,
changeType varchar( 10 ),
changedColumnName varchar( 15 ),
originalPrimaryKey int,
originalIntCol int,
originalVarcharCol varchar( 20 )
);
create trigger insertTrigger
after insert
on original
referencing new as new
for each row
insert into changeCollector values ( default, 'insert', 'all',
new.primaryKey, new.intCol, new.varcharCol );
create trigger updateIntCol
after update of intCol
on original
referencing new as new
for each row
insert into changeCollector values ( default, 'update', 'intCol',
new.primaryKey, new.intCol, null );
create trigger updateVarcharCol
after update of varcharCol
on original
referencing new as new
for each row
insert into changeCollector values ( default, 'update', 'varcharCol',
new.primaryKey, null, new.varcharCol );
insert into original( intCol, varcharCol ) values ( 1, 'one' ), ( 2,
'two' ), ( 3, 'three' );
select * from original order by primaryKey;
select * from changeCollector order by changeID;
update original set intCol = 10 where intCol = 1;
update original set varcharCol = 'twenty' where intCol = 2;
select * from original order by primaryKey;
select * from changeCollector order by changeID;
I thought I can avoid using a lot of Java code for these tasks.
Using Java code for searching(filtering) only the updated columns names from
a specific table, and their values will cause me a delay on my replication
system, a drawback.
First a trigger will fire, then a Java code ( stored procedure ) will be
called ( the Java code will go back and query the db - I don't like this,
why I can't solve this problem using Derby functionality, triggers ? ), a
comparison will be made on the last 2 rows from the audit table, pick only
the different values + the columns names, create a specific message with
this information.
There is no other ways of avoiding using Java code for these tasks ?
Please advice me.
Regards,
George
--
View this message in context:
http://apache-database.10148.n7.nabble.com/Re-Derby-replication-system-Need-help-tp138003p138203.html
Sent from the Apache Derby Users mailing list archive at Nabble.com.