Announcement

Collapse
No announcement yet.

FB 2.1 Modified - Simulation im Trigger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • FB 2.1 Modified - Simulation im Trigger

    Hallo,

    ich möchte im Trigger erkennen, ob überhaupt Änderungen erfolgt sind.
    Dafür habe ich eine Procedure zum Generieren des SQL geschrieben:

    Code:
    SET TERM ^ ;
    CREATE OR ALTER PROCEDURE GET_MODIFIED_SQL (
        table_name varchar(31))
    returns (
        result varchar(10000))
    as
    declare variable zaehler integer = 0;
    declare variable field_name varchar(31);
    begin
      result = 'select case when (';
      for select trim(rdb$field_name) from rdb$relation_fields where
                 rdb$relation_name = :table_name and rdb$update_flag=1
                 into :field_name do
      begin
        if (:zaehler = 0) then
          result = result||'(old.'||:field_name||' is distinct from new.'||:field_name||') ';
        else
          result = result||' or (old.'||:field_name||' is distinct from new.'||:field_name||') ';
        zaehler = zaehler + 1;
      end
      result = result||') then ''T'' else ''F'' end from rdb$database';
      suspend;
    end^
    SET TERM ; ^
    GRANT EXECUTE ON PROCEDURE GET_MODIFIED_SQL TO SYSDBA;
    Im Trigger versuche ich dann, das Statement zu starten:
    Code:
    CREATE OR ALTER trigger adresse_bu0 for adresse
    active before update position 0
    as
    declare variable modified_sql varchar(10000);
    declare variable is_modified char(1);
    begin
      select result from get_modified_sql('ADRESSE') into :modified_sql;
      execute statement :modified_sql into :is_modified;
      if (is_modified = 'T') then
        new.anzahl = coalesce(old.anzahl, 0) + 1;
    end
    Aber er sagt: Column unknown: OLD.ID

    Jetzt sieht es so aus, als ob execute statement mit old nicht kann.

    Kann das jemand bestätigen oder habe ich nur einen Fehler gemacht.

    Ich habe das Problem, dass ich über einen View mehrere tabellen update.
    Jetzt schreibt er z.B. in die Tabelle Adresse über den Trigger, dass Benutzer XYZ den Datensatz geändert hat. Tatsächlich hat er aber nur die Kundennummer geändert. Und das möchte ich verhindern.
    Leider gibt es im Trigger kein MODIFIED oder so.

    Danke, Frank

  • #2
    Die old und new Kontextvariablen gibt es nur in Triggern nicht in SPs.
    Auch nicht wenn die SP vom Trigger aufgerufen wird

    Comment


    • #3
      Originally posted by Markus Kinzler View Post
      Die old und new Kontextvariablen gibt es nur in Triggern nicht in SPs.
      Auch nicht wenn die SP vom Trigger aufgerufen wird
      Mensch Markus - nicht immer so oberflächlich lesen.
      Ich rufe keine Procedure mit old - Variablen auf. Ich führe mit execute statement eine Statement aus, welches OLD und NEW enthält.
      Die Procedure liefert mir nur das Statement.

      Frank

      Comment


      • #4
        Sorry, habe nur old. in der SP gesehen und übersehen das dies in Strings war.
        ID wid sicherlich der PK sein. Vielleicht existiert ID im old-Kontext aus diesem Grund nicht?

        Comment


        • #5
          OK, ich habe das jetzt in den 1.5 er Release Notes gefunden:

          Der "EXECUTE STATEMENT" DSQL-String kann keine Parameter in jeglicher Syntax-Variation beinhalten.

          Damit geht es also nicht.

          Frank

          Comment

          Working...
          X