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