Icon View Incident Report

Serious Serious
Reported By: Elevate Software
Reported On: 7/29/2004
For: Version 4.09 Build 1
# 1799 Using Transactions In Triggers Can Cause Access Violation

Using a transaction in a trigger can cause an access violation, such as is the case with the following cascading delete example:

procedure TForm1.EngineBeforeDeleteTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
var
   OrdersQuery: TDBISAMQuery;
begin
   if (AnsiCompareText(TableName,'customer')=0) then
      begin
      TriggerDatabase.StartTransaction;
      OrdersQuery:=TDBISAMQuery.Create(nil);
      try
         with OrdersQuery do
            begin
            SessionName:=TriggerDatabase.SessionName;
            DatabaseName:=TriggerDatabase.DatabaseName;
            RequestLive:=True;
            SQL.Text:='DELETE FROM Orders '+
                      'WHERE CustNo=:CustNo';
            ParamByName('CustNo').AsFloat:=CurrentRecord.FieldByName('CustNo').AsFloat;
            ExecSQL;
            end;
      finally
         OrdersQuery.Free;
      end;
      end;
end;

procedure TForm1.EngineDeleteError(Sender: TObject;
  ErrorSession: TDBISAMSession; ErrorDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord; E: Exception;
  var Action: TDataAction);
begin
   Action:=daFail;
   if ErrorDatabase.InTransaction then
      ErrorDatabase.Rollback;
end;

procedure TForm1.EngineAfterDeleteTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
   if (AnsiCompareText(TableName,'customer')=0) then
      begin
      if TriggerDatabase.InTransaction then
         TriggerDatabase.Commit;
      end;
end;



Resolution Resolution
Fixed Problem on 7/29/2004 in version 4.10 build 1
Image