Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

INSERT in neue tbl nach Vergleich

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Rambo21, 5 Juli 2016.

  1. Rambo21

    Rambo21 Aktiver Benutzer

    Hallo Leute,

    Ich habe eine Tabelle "Konto" wo ich meine Kontodaten einspiele:
    Id(PK), Konto, Name, KntCreationDate, KntClosingDate,DataCreation
    5 , 123456 , XYZ , 01.05.2015 , NULL , 05.07.2016 07:45:00

    in der weiteren Tabelle "TypeIndication" möchte ich nun festlegen, ob das Konto aus Tbl "Konto" der erste Eintrag in der Tabelle ist oder eine Änderung. Im jetzigen Fall ein Ersteintrag:
    Id(PK), KontoId(FK), Indication
    1, 5, E E steht für Ersteintrag

    Wenn ich in weiterer Folge das Konto 123456 in die Tbl "Konto" nochmal anlege, zB. mit KntClosingDate:
    Id(PK), Konto, Name, KntCreationDate, KntClosingDate,DataCreation
    5 , 123456 , XYZ , 01.05.2015 , NULL , 05.07.2016 07:45:00
    6 , 123456 , XYZ , 01.05.2015 , 10.05.2016 , 05.07.2016 07:50:00

    Soll mir in der Tbl "TypeIndication" folgendes eingetragen werden:
    Id(PK), KontoId(FK), Indication
    1 , 5 , E
    2 , 6 , A A steht für Änderung

    Wie sieht nun mein INSERT Statement nun aus? Ich bin zu blöd um dahinter zu kommen.

    Danke für eure Unterstützung.

    LG
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Warum trägst das da nochmal ein, warum änderst nicht einfach das Feld? Wenn Du das loggen willst, wann was geändert wurde, dann kannst das via TRIGGER machen. Passende Beispiele könnte ich Dir zeigen - für PostgreSQL.
     
  3. Rambo21

    Rambo21 Aktiver Benutzer

    Ich muss in einem Report zeigen, ob der Eintrag ein E oder ein A ist. Bei einem Eintrag kann sich auch zB. der Name ändern. Da muss ich den alten Namen auch ausgeben. Muss dann ich im Report, wo die Änderung angezeigt wird, dann folgendes zeigen:
    Indication: A
    Konto: 123456
    Name: ABC
    Alter Name: XYZ
    etc...
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ja, ok. Wie gesagt: ich würde einen TRIGGER nehmen, der das passend in eine Logtabelle wegloggt. Im Trigger kannst ja schon prüfen, was sind ändert, und das schon passend dann loggen.
     
  5. Rambo21

    Rambo21 Aktiver Benutzer

    Hast du ein Bsp.?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    mal ganz quick&dirty:

    zuerst Tabellen und TRIGGER:

    Code:
    privat=# create table foo(id int primary key, name text, val int);
    CREATE TABLE
    privat=*# create table foo_log(log_id serial primary key, id int, ts timestamp default now(), who text default current_user, info text);CREATE TABLE
    privat=*# create or replace function foo_log() returns trigger as $$begin if TG_OP = 'UPDATE' then insert into foo_log(id, info) values (new.id, TG_OP || ' OLD: ' || old.name || ', ' || old.val || ' NEW: ' || new.name || ', ' || new.val); else insert into foo_log(id, info) values (new.id, TG_OP || ' NEW: ' || new.name || ', ' || new.val); end if; return NEW; end; $$language plpgsql;
    CREATE FUNCTION
    privat=*# create trigger trg_log before insert or update on foo for each row execute procedure foo_log();
    CREATE TRIGGER
    privat=*# commit;
    COMMIT
    privat=#
    
    Nun ein Insert und ein Update:

    Code:
    privat=# insert into foo values (1, 'test 1', 1);
    INSERT 0 1
    privat=*# commit;
    COMMIT
    privat=# update foo set name = 'test update' where id = 1;
    UPDATE 1
    privat=*# commit;
    COMMIT
    privat=# select * from foo;
     id |  name  | val
    ----+-------------+-----
      1 | test update |  1
    (1 Zeile)
    
    privat=*# select * from foo_log;
     log_id | id |  ts  |  who  |  info   
    --------+----+----------------------------+-------------+-------------------------------------------
      1 |  1 | 2016-07-05 10:43:54.711255 | akretschmer | INSERT NEW: test 1, 1
      2 |  1 | 2016-07-05 10:44:04.199612 | akretschmer | UPDATE OLD: test 1, 1 NEW: test update, 1
    (2 Zeilen)
    
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden