Consultor Eletrônico



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.