Firebird: Row Counter

2. Einbau in Tabellen

Die Benutzung des Datensatzzählers wird hier auf drei verschiedene Weisen gezeigt: INSERT und DELETE in zwei Triggern, INSERT und DELETE in einem Trigger und das Mitzählen eines Aktiv-Flags.

INSERT und DELETE in zwei Triggern

Wird der Datenstzzähler über je einen INSERT und DELETE Trigger verwendet, ist die Benutzung sehr einfach. Bei INSERT wird +1 und bei DELETE -1 zusammen mit dem Generator in die temporäre Tabelle eingetragen. Diese Beispiel ist in der Beispieldatenbank in der Tabelle TABLE1 mit den Triggern TABLE1_AI0 und TABLE1_AD0 und dem Generator "gen_TABLE1" umgesetzt.
CREATE TRIGGER TABLE1_AI0 FOR TABLE1
ACTIVE AFTER INSERT POSITION 0
AS
BEGIN
  /* Datensatzanzahländerung merken */
  INSERT INTO "_TABLE_ROW_COUNT"
    ("rcn_generator", "rcn_count")
  VALUES
    ('"gen_TABLE1"', 1); /* einen Datensatz hinzugefügt */
END

CREATE OR ALTER TRIGGER TABLE1_AD0 FOR TABLE1
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
  /* Datensatzanzahländerung merken */
  INSERT INTO "_TABLE_ROW_COUNT"
    ("rcn_generator", "rcn_count")
  VALUES
    ('"gen_TABLE1"', -1); /* einen Datensatz gelöscht */
END

INSERT und DELETE in einem Triggern

Bei einen gemeinsamen INSERT und DELETE Trigger ist die Verwendung analog. Hier muß dann aber im Trigger selbst zwischen INSERT und DELETE unterschieden werden. Das wird durch die Zuweisung von +1, -1 oder 0 zur Variable INC realisiert. Dann wird der Wert, wenn ungleich null, zusammen mit dem Generatornamen in die temporäre Tabelle eingetragen. Diese Beispiel ist in der Beispieldatenbank in der Tabelle TABLE2 mit dem Trigger TABLE1_AID0 und dem Generator "gen_TABLE2" umgesetzt.
CREATE TRIGGER TABLE2_AID0 FOR TABLE2
ACTIVE AFTER INSERT OR DELETE POSITION 0
AS
DECLARE VARIABLE INC TYPE OF "dom_INT16";
BEGIN
  /* beim Einfügen */
  IF (INSERTING)
  THEN
    INC = 1;
  ELSE
  /* beim löschen */
  IF (DELETING)
  THEN
    INC = -1;
  ELSE
    /* keine Datensatzänderung */
    INC = 0;
  /* Datensatzanzahländerung merken */
  IF (INC <> 0)
  THEN
    INSERT INTO "_TABLE_ROW_COUNT"
      ("rcn_generator", "rcn_count")
    VALUES
      ('"gen_TABLE2"', :INC);
END

Aktiv-Flag zählen

Wenn Datensatzzustände gezählt werden sollen, müssen auch die Änderungen der Datensätze überwacht werden. Diese Beispiel ist in der Beispieldatenbank in der Tabelle TABLE3 mit dem Trigger TABLE3_AIUD1 und dem Generator "gen_TABLE3ACTIVE" umgesetzt.
CREATE TRIGGER TABLE3_AIUD1 FOR TABLE3
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 1
AS
DECLARE VARIABLE INC TYPE OF "dom_INT16";
BEGIN
  /* Variable vorbelegen */
  INC = 0;
  /* beim Einfügen nur Flags <> 0 zählen */
  IF (INSERTING)
  THEN
  BEGIN
    IF (NEW."tb3_active" <> 0)
    THEN
      INC = 1;
  END
  ELSE
  /* beim löschen nur Flags <> 0 zählen */
  IF (DELETING)
  THEN
  BEGIN
    IF (OLD."tb3_active" <> 0)
    THEN
      INC = -1;
  END
  ELSE
  /* beim Aktualisieren nur geänderte Flags zählen */
  IF (UPDATING)
  THEN
  BEGIN
    /* Flag wurde gelöscht? */
    IF (OLD."tb3_active" <> 0 AND NEW."tb3_active" = 0)
    THEN
      INC = -1;
    ELSE
      /* Flag wurde gesetzt? */
      IF (OLD."tb3_active" = 0 AND NEW."tb3_active" <> 0)
      THEN
        INC = 1;
  END
  /* Zähler <> 0 eintragen */
  IF (INC <> 0)
  THEN
    INSERT INTO "_TABLE_ROW_COUNT"
      ("rcn_generator", "rcn_count")
    VALUES
      ('"gen_TABLE3ACTIVE"', :INC);
END