Trigger Problem

digidax

Benutzer
Beiträge
11
Hi,
die Tabelle opc_data:
+--------+----------------+-----+----+----+-----+-----+-----+-----+---------------------+--------+--------+
| nummer | ip | z22 | h1 | h2 | c | v76 | v78 | v88 | stamp | zyklus | status |
+--------+----------------+-----+----+----+-----+-----+-----+-----+---------------------+--------+--------+
| 8 | 192.168.1.71 | 0 | 70 | 44 | 105 | 714 | 682 | 672 | 2016-03-08 15:56:37 | 219 | 1 |
+--------+----------------+-----+----+----+-----+-----+-----+-----+---------------------+--------+--------+

wird von folgendem Trigger beobachtet:

DELIMITER //
CREATE TRIGGER `testserver`.`opc_parameter_log` AFTER UPDATE ON `testserver`.`opc_data`
FOR EACH ROW
BEGIN
IF NEW.status != OLD.status THEN
INSERT INTO opc_log (stempel,nummer,status) VALUES (NOW(),NEW.nummer,NEW.status);
END IF;

IF NEW.z22 != OLD.z22 THEN
INSERT INTO opc_log (stempel,nummer,z22) VALUES (NOW(),NEW.nummer,NEW.z22);
END IF;

IF NEW.h1 != OLD.h1 THEN
INSERT INTO opc_log (stempel,nummer,h1) VALUES (NOW(),NEW.nummer,NEW.h1);
END IF;

IF NEW.h2 != OLD.h2 THEN
INSERT INTO opc_log (stempel,nummer,h2) VALUES (NOW(),NEW.nummer,NEW.h2);
END IF;

IF NEW.c != OLD.c THEN
INSERT INTO opc_log (stempel,nummer,c) VALUES (NOW(),NEW.nummer,NEW.c);
END IF;

END
//
DELIMITER ;

und schreibt bei einer Veränderung der Tabelle opc_data (UPDATE) den veränderten Wert in die Tabelle opc_log. Das funktioniert solange nur ein Wert in der Tabelle opc_data per UPDATE geändert wird. Werden zwei Werte (z.B. "status" und "h2" geändert), wird vom Trigger nur h2 in opc_log geschrieben.

Wie kann ich es im Trigger ermöglichen, dass alle geänderten Werte in opc_log geschrieben werden?

lg
Frank
 
Werbung:
works for me:

Code:
test=# create table foo (id int primary key, c1 int, c2 int, c3 int);
CREATE TABLE  

test=*# create or replace function trigger_foo() returns trigger as $$begin if new.c1 != old.c1 then insert into foo_log values (new.id, 'c1',old.c1, new.c1); end if; if new.c2 != old.c2 then insert into foo_log values (new.id, 'c2', old.c2, new.c2); end if; if old.c3 != new.c3 then insert into foo_log values (new.id, 'c3', old.c3, new.c3); end if; return new; end; $$language plpgsql;  
CREATE FUNCTION 

test=*# create trigger trg1 before update on foo for each row execute procedure trigger_foo();
CREATE TRIGGER
test=*# insert into foo values (1, 1,2,3);
INSERT 0 1
test=*# insert into foo values (2, 10,20,30);
INSERT 0 1
test=*# select * from foo;
id | c1 | c2 | c3
----+----+----+----
  1 |  1 |  2 |  3
  2 | 10 | 20 | 30
(2 rows)

test=*# create table foo_log (id int, col text, old int, new int);
ERROR:  relation "foo_log" already exists
test=*# drop table foo_log;
DROP TABLE
test=*# create table foo_log (id int, col text, old int, new int);
CREATE TABLE
test=*# select * from foo;
id | c1 | c2 | c3
----+----+----+----
  1 |  1 |  2 |  3
  2 | 10 | 20 | 30
(2 rows)

test=*# update foo set c1=5 where id=1;
UPDATE 1
test=*# select * from foo_log;
id | col | old | new
----+-----+-----+-----
  1 | c1  |  1 |  5
(1 row)

test=*# update foo set c2=25, c3=35 where id=2;
UPDATE 1
test=*# select * from foo_log ;
id | col | old | new
----+-----+-----+-----
  1 | c1  |  1 |  5
  2 | c2  |  20 |  25
  2 | c3  |  30 |  35
(3 rows)

test=*#

ich sehe jetzt bei Dir auf den ersten Blick keinen Fehler - außer die Verwendung von MySQL ;-)[/code]
 
AFTER ist eigentlich egal, ist ja nur ne Log.

Hast du es mal ohne ; hinter INSERT und END IF probiert? Vieleicht springt er da irgendwo raus...
 
Werbung:
So Fehler gefunden: Es hat nix mit Mysql zu tun. Das Problem war von der logischen Art. Der Wert "0" war mehrdeutig:

Die Maschine UPDATEd die Werte in die Tabelle opc_data für den Status 0 => Maschine aus, und 1 => Maschine ein.

Wenn sich nun im Datensatz ein Parameter ändert, dann feuert der Trigger nur den geänderten Parameter in die Log-Tabelle, der Status wird "0" obwohl die Maschine noch läuft.

Ich habe das dahingehend gelöst, dass die Maschine nun 1 => Maschine aus und 2=> Maschine ein für den Status liefert.

Funktioniert. Sorry für den falschen MySQL Alarm und danke für die Hilfe zur Ausgrenzung des Fehlers.



Lg

Frank
 
Zurück
Oben