Firebird SQL - Prozeduren: Datensatz kann von einem Programm nicht gelöscht werden

Iceboone

Neues Mitglied
Hallo,

ich habe eine Frage. Ich habe in einem Verwaltungsprogramm versucht einen Datensatz, den ich per "Insert To"- Befehl geschrieben habe mit dem Programm zu löschen. Dies funktioniert nicht mit folgender Fehlermeldung:

Der Datensatz wurde schon von einem anderen Benutzer verarbeitet.

Die Tabelle wird aktualisiert.


Wenn ich den Datensatz dann öffne und manuell speicher, kann ich den Datensatz danach löschen.

Meine Frage zielt auf Prozeduren ab. Ich habe jetzt in der SQL-Tabelle gesehen, dass es eine Prozedur gibt, die nach DELETE, INSERT oder UPDATE getriggert wird. Dieser Trigger scheint aber nur durch das Programm selbst ausgelöst zu werden. Kann man solche Trigger bzw. Prozeduren manuell per Befehl starten?

Für jeden Tipp wäre ich dankbar.

Vielen Dank im Voraus.

Gruß Volker

P.S.:

Hier wäre der Trigger, der ausgelöst wird:

SQL:
CREATE TRIGGER CL_COURTAGE FOR COURTAGE AFTER INSERT OR UPDATE OR DELETE
AS
DECLARE VARIABLE sUSER_NAME VARCHAR(15);
DECLARE VARIABLE AKTIV INTEGER;
DECLARE VARIABLE ISEVENT VARCHAR(9);
DECLARE VARIABLE REFIDNR VARCHAR(15);
DECLARE VARIABLE XML VARCHAR(32000);
DECLARE VARIABLE sDESCRIPTION VARCHAR(150);
DECLARE VARIABLE sTABLEINFO VARCHAR(50);
declare variable "VAR1" VARCHAR(1000);
declare variable "VAR2" VARCHAR(1000);
declare variable "VAR2ZV" VARCHAR(1000);
declare variable "INSERTDATE" VARCHAR(1000);
declare variable "INSERTTIME" VARCHAR(1000);
declare variable "INSERTUSER" VARCHAR(1000);
declare variable "VAR3" VARCHAR(1000);
declare variable "MONATE" VARCHAR(1000);
declare variable "PRODUKT" VARCHAR(1000);
declare variable "PROZENT" VARCHAR(1000);
declare variable "PROZENTZV" VARCHAR(1000);
declare variable "VAR4" VARCHAR(1000);
declare variable "STICHTAG" VARCHAR(1000);
declare variable "TEXT" VARCHAR(1000);
declare variable "VAR5" VARCHAR(1000);
BEGIN
SELECT COUNT(*) FROM changelog_config WHERE UPPER(TABLENAME)='COURTAGE' INTO :aktiv;
if (aktiv > 0) then
BEGIN
if (new.bearbdat = old.bearbdat AND new.bearbzeit = old.bearbzeit) then
  sUSER_NAME = 'SYSTEM_BATCH';
else if (new.bearbeiter is null) then
  sUSER_NAME = 'SYSTEM_UNK';
else
  sUSER_NAME = new.bearbeiter;
if (deleting) then
begin
  sUSER_NAME = 'unbekannt';
  isevent = (select cast((_ISO8859_1 X'4CF6736368656E') as varchar(9) character set ISO8859_1) from rdb$database);
  REFIDNR = old.IDNR;
end
else
begin
  REFIDNR = new.IDNR;
  if (inserting) then
    isevent = 'Neuanlage';
  else
    isevent = (select cast((_ISO8859_1 X'C46E646572756E67') as varchar(9) character set ISO8859_1) from rdb$database);
end
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR1", new."VAR1", 'C', 0, 'VAR1' returning_values "VAR1";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR2", new."VAR2", 'C', 0, 'VAR2' returning_values "VAR2";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR2ZV", new."VAR2ZV", 'C', 0, 'VAR2ZV' returning_values "VAR2ZV";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."INSERTDATE", new."INSERTDATE", 'D', 0, 'INSERTDATE' returning_values "INSERTDATE";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."INSERTTIME", new."INSERTTIME", 'T', 0, 'INSERTTIME' returning_values "INSERTTIME";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."INSERTUSER", new."INSERTUSER", 'C', 0, 'INSERTUSER' returning_values "INSERTUSER";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR3", new."VAR3", 'N', 2, 'VAR3' returning_values "VAR3";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."MONATE", new."MONATE", 'I', 0, 'MONATE' returning_values "MONATE";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."PRODUKT", new."PRODUKT", 'C', 0, 'PRODUKT' returning_values "PRODUKT";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."PROZENT", new."PROZENT", 'N', 2, 'PROZENT' returning_values "PROZENT";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."PROZENTZV", new."PROZENTZV", 'N', 2, 'PROZENTZV' returning_values "PROZENTZV";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR4", new."VAR4", 'C', 0, 'VAR4' returning_values "VAR4";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."STICHTAG", new."STICHTAG", 'D', 0, 'STICHTAG' returning_values "STICHTAG";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."TEXT", new."TEXT", 'C', 0, 'TEXT' returning_values "TEXT";
EXECUTE PROCEDURE CHANGELOG_DEFAULT old."VAR5", new."VAR5", 'C', 0, 'VAR5' returning_values "VAR5";

 XML = '<CHANGES>';
 XML = XML||"VAR1"||"VAR2"||"VAR2ZV"||"INSERTDATE"||"INSERTTIME"||"INSERTUSER"||"VAR3"||"MONATE"||"PRODUKT"||"PROZENT"||"PROZENTZV"||"VAR4"||"STICHTAG"||"TEXT"||"VAR5"||'</CHANGES>';
  if (deleting) then
    sDESCRIPTION=substring(coalesce(old."VAR4", '')||'/'||coalesce(old."TEXT", '')||'/'||coalesce(old."STICHTAG", '') FROM 1 for 150);
  else
    sDESCRIPTION=substring(coalesce(new."VAR4", '')||'/'||coalesce(new."TEXT", '')||'/'||coalesce(new."STICHTAG", '') FROM 1 for 150);
 sTABLEINFO=(select cast((_ISO8859_1 X'436F7572746167656E') as varchar(150) character set ISO8859_1) from rdb$database);
 if (XML != '<CHANGES></CHANGES>') then
INSERT INTO CHANGELOG (CHANGELOGID, BEARBDAT, BEARBZEIT, BEARBEITER, DESCRIPTION, TABLENAME, TABLENAME_DISP, "KEY", STATUSEVENT, CHANGES) VALUES (gen_id(CHANGELOG_ID, 1), current_date, current_time, :sUSER_NAME, :sDESCRIPTION ,'COURTAGE', :sTABLEINFO ,:refIDNR, :isEvent ,:XML);
 WHEN SQLCODE -802 DO
 begin
  sDESCRIPTION=(select cast((_ISO8859_1 X'DC6265726C6175666665686C6572') as varchar(150) character set ISO8859_1) from rdb$database);
INSERT INTO CHANGELOG (CHANGELOGID, BEARBDAT, BEARBZEIT, BEARBEITER, DESCRIPTION, TABLENAME, TABLENAME_DISP, "KEY", STATUSEVENT, CHANGES) VALUES (gen_id(CHANGELOG_ID, 1), current_date, current_time, :sUSER_NAME, :sDESCRIPTION, 'COURTAGE', :sTABLEINFO, :refIDNR, 'Fehler', '<ERROR>CONCAT_OVERFLOW</ERROR>');
 end
end
end
 

Mat

Mitglied
Kenne Firebird nicht, aber das klingt, als müsstest du mit Transactions arbeiten, um sowas zu verhindern.

Vielleicht weiß jemand Genaueres.
 

Iceboone

Neues Mitglied
Die Lösung war recht simpel. In dem Moment wo ich neben dem Bearbeitungsdatum auch eine Bearbeitungszeit angelegt hatte, war der "Bearbeitungsmodus" beendet. Manchmal sind die Lösungen so einfach. Danke für eure Hilfe.
 
Oben Unten