Kbase P51066: The database WRITE trigger fires unexpectedly.
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  16/10/2008 |
|
Status: Verified
SYMPTOM(s):
The database WRITE trigger fires unexpectedly.
Executing a "DELETE OBJECT" Buffer-Handle as in the following code:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE qh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE bh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE fh AS WIDGET-HANDLE NO-UNDO.
CREATE BUFFER bh FOR TABLE "customer".
CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each customer share-lock").
qh:QUERY-OPEN.
qh:GET-FIRST.
REPEAT i = 1 TO bh:NUM-FIELDS:
fh = bh:BUFFER-FIELD(i).
IF fh:NAME = "Country" THEN DO TRANSACTION:
fh:BUFFER-VALUE = "United States".
LEAVE.
END.
END.
DELETE WIDGET bh.
CAUSE:
This is expected behavior. If the record to which the buffer object refers to was changed and the record was not released yet, the DELETE OBJECT <buffer object> will release it and will cause the associated database WRITE trigger to fire.
FIX:
To prevent the database trigger from firing:
1. Use the DISABLE-LOAD-TRIGGERS( ) as per the following modified code:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE qh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE bh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE fh AS WIDGET-HANDLE NO-UNDO.
CREATE BUFFER bh FOR TABLE "customer".
/*********** This statement disables the WRITE trigger ***********/
bh:DISABLE-LOAD-TRIGGERS(YES).
CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each customer share-lock").
qh:QUERY-OPEN.
qh:GET-FIRST.
REPEAT i = 1 TO bh:NUM-FIELDS:
fh = bh:BUFFER-FIELD(i).
IF fh:NAME = "Country" THEN DO TRANSACTION:
fh:BUFFER-VALUE = "Canada".
LEAVE.
END.
END.
DELETE WIDGET bh.
2. Undo the transaction that modified the record as per the following modified code:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE qh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE bh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE fh AS WIDGET-HANDLE NO-UNDO.
CREATE BUFFER bh FOR TABLE "customer".
CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each customer share-lock").
qh:QUERY-OPEN.
qh:GET-FIRST.
REPEAT i = 1 TO bh:NUM-FIELDS:
fh = bh:BUFFER-FIELD(i).
IF fh:NAME = "Country" THEN DO TRANSACTION:
fh:BUFFER-VALUE = "Germany".
/******* This statement UNDOes the changes to the record *******/
IF bh:CURRENT-CHANGED THEN UNDO.
LEAVE.
END.
END.
DELETE WIDGET bh.
2. Delete the record as per the following modified code:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE qh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE bh AS WIDGET-HANDLE NO-UNDO.
DEFINE VARIABLE fh AS WIDGET-HANDLE NO-UNDO.
CREATE BUFFER bh FOR TABLE "customer".
CREATE QUERY qh.
qh:SET-BUFFERS(bh).
qh:QUERY-PREPARE("for each customer where custnum = 3035 share-lock").
qh:QUERY-OPEN.
qh:GET-FIRST.
REPEAT i = 1 TO bh:NUM-FIELDS:
fh = bh:BUFFER-FIELD(i).
IF fh:NAME = "Country" THEN DO TRANSACTION:
fh:BUFFER-VALUE = "Canada".
/******* This statement DELETEs the record altogether *******/
bh:BUFFER-DELETE.
LEAVE.
END.
END.
DELETE WIDGET bh.