Automatisch Übernahme von tab 1 to tab 2

Werbung:
Was ist Unverständlich? Die Aufgabe? Es it wie folgt:
Die Nummer ID aus Tabelle Krit soll automatisch übernommen werden in die Tabelle Objekt.KritID
Bedingung: Ziel soll in dem Bereich [L level, H level] sein
 
Foreign Key mit onchange cascade womöglich?

Der entsprechende (vereinfachte) Code:
Code:
create table a(b integer primary key);
create table b(b integer references a(b) on update cascade);
insert into a(b) values (1);
insert into b(b) values (1);
update a set b = 2;
select * from b;

Ergebnis:
Code:
2

Erklärung:
Wenn der Wert in tabelle a geändert wird, verändert er sich auch in tabelle b...

EDIT:
Damit der Wert in einem Bereich ist evtl. Check-Constraint mit between definieren, geht bei PostgreSQL, keine Ahnung, ob bei deinem auch ;)

Code:
alter table a add constraint in_bereich check (b between 1 and 10);

Test:
Code:
insert into a values (11);

Ergebnis:
Code:
ERROR: FEHLER:  neue Zeile für Relation »a« verletzt Check-Constraint »in_bereich«
 
Zuletzt bearbeitet:
zum Beispiel, wann das erfolgen soll. Bein Eintrag in die eine Tabelle, oder später, wenn 50 FDantillionen Einträge existieren?
Es soll erfolgen nach Update von dem Feld "Ziel" in der Tabelle Objekt.
Also Jedes Mal, wenn Target geändert wird, muss der Wert innerhalb des Intervalls L level , H level liegen, damit KritID sich automatisch auf dieser Basis füllen kann.

Beispiel im Bild
 
Beispiele in Bildern sind Murks. Prüfen, ob ein Wert in einem definiertem Interval liegt geht via CHECK-Constraint, beliebige andere Aktionen via TRIGGER.
 
Beispiele in Bildern sind Murks. Prüfen, ob ein Wert in einem definiertem Interval liegt geht via CHECK-Constraint, beliebige andere Aktionen via TRIGGER.
fangen wir mal einfach an. Der CHECK-Constraint:

Code:
postgres=# create table t1(id int generated always as identity, value int, low_limit int, max_limit int, check (value between low_limit and max_limit));
CREATE TABLE
postgres=# insert into t1 (value, low_limit, max_limit) values (10,5,15);
INSERT 0 1
postgres=# insert into t1 (value, low_limit, max_limit) values (2,25,35);
ERROR:  new row for relation "t1" violates check constraint "t1_check"
DETAIL:  Failing row contains (2, 2, 25, 35).
postgres=#
 
und nun ein TRIGGER:

Code:
postgres=# create or replace function t1_to_t2() returns trigger as $$begin insert into t2(id, value) values (new.id, new.value); return new; end;$$language plpgsql;
CREATE FUNCTION
postgres=# create trigger trg1 after insert or update on t1 for each row execute procedure t1_to_t2();
CREATE TRIGGER
postgres=# insert into t1 (value, low_limit, max_limit) values (27,25,35);
INSERT 0 1
postgres=# select * from t1;
 id | value | low_limit | max_limit 
----+-------+-----------+-----------
  1 |    10 |         5 |        15
  4 |    27 |        25 |        35
(2 rows)

postgres=# select * from t2;
 id | value |            ts             
----+-------+---------------------------
  4 |    27 | 2022-08-01 13:21:17.05483
(1 row)

postgres=#
 
meine Beispiele sind für PostgreSQL. Das ist, vereinfacht gesagt, eine andere Datenbank als Deine. Sprich: Du wirst das anpassen müssen. Ich kenne Access nicht.
 
Werbung:
Access kann vermutlich weder Trigger noch Check Constraints. Ich fürchte das musst du in Access komplett in Visual Basic oder irgendwas on Top machen was eigentlich nicht zur Datenbank gehört, also quasi Bestandteil des Frontends bzw. der Eingabemaske ist. Oder du wechselt auf eine vernünftige Datenbank, Access ist so ein bisschen auf dem toten Gleis.
 
Zurück
Oben