PL/SQL: Mit Trigger nach Insert neues Table erstellen

alexrausch

Benutzer
Beiträge
8
Hallo,

ich beschäftige mich zum ersten mal mit PL/SQL und Triggern und habe folgendes Problem, bzw. wollte fragen ob es möglich ist bevor ich meine Zeit verschwende.

Ich will bei einem Insert in eine Tabelle eine neue Tabelle erstellen die so heisst wie eine Spalte des neuen Tabelleneintrages.

ist das möglich?

und was müsste ich im CREATE TABLE für den Tablenamen reinschreiben?


vielen dank
 
Zuletzt bearbeitet:
Werbung:
Hallo,

ich beschäftige mich zum ersten mal mit PL/SQL und Triggern und habe folgendes Problem, bzw. wollte fragen ob es möglich ist bevor ich meine Zeit verschwende.

Ich will bei einem Insert in eine Tabelle eine neue Tabelle erstellen die so heisst wie eine Spalte des neuen Tabelleneintrages.

ist das möglich?

und was müsste ich im CREATE TABLE für den Tablenamen reinschreiben?


vielen dank

Möglich ist das, nur warum? Mir sieht Dein Vorhaben nach einem groben Designfehler aus, aber egal:

Code:
test=# create table foo (t_name text);
CREATE TABLE
test=*# create or replace function new_table() returns trigger as $$begin execute 'create table ' || new.t_name || ' (id int)'; return new; end;$$language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 after insert on foo for each row execute procedure new_table();
CREATE TRIGGER
test=*# insert into foo values ('ganz_doofe_sache_das');
INSERT 0 1
test=*# \d ganz_doofe_sache_das
Table "public.ganz_doofe_sache_das"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer |

Mit PostgreSQL gemacht, Oraggle sollte ähnlich sein.
 
Das ganze ist für ein Datenbanken Projekt, dass ich an der FH machen muss. Ich habe die Vorgabe, einen Update- und einen Insert-Trigger einzubauen.

Ich habe ein Unternehmen genommen, dass mehrere Filialien und mehrere Lager hat. Nun wollte ich, dass beim hinzufügen eines neuen Lagers gleichzeitig eine neue Tabelle für dessen Lagerbestand angelegt wird. Ich fand die Idee eigentlich eher orginell :) oder meinst du, ich sollte das lieber nicht machen?

Vielen Dank schonmal, ich versuche jetzt mich mit dem Code ausseinanderzusetzten.

Gruß
 
Ich habe ein Unternehmen genommen, dass mehrere Filialien und mehrere Lager hat. Nun wollte ich, dass beim hinzufügen eines neuen Lagers gleichzeitig eine neue Tabelle für dessen Lagerbestand angelegt wird. Ich fand die Idee eigentlich eher orginell :) oder meinst du, ich sollte das lieber nicht machen?

Ah versteh. Nicht völlig falsch. Es gibt die Möglichkeit der Partitionierung. Da erstellt man z.B. eine Tabelle Lager, die aber leer ist und bleibt. Und man erstellt für jedes einzelne Lager eine von dieser Tabelle abgeleitete Kind-Tabelle, in die die Daten kommen. Zusammen mit 'Constraint Exclusion' (so nennt man es bei PostgreSQL) führt das dazu, daß der Planner weiß, daß Daten für ein bestimmtes Lager in genau dieser Kindtabelle stehen. Und das ganze ist völlig transparent, man fragt IMMER die (leere) Haupttabelle ab.

Aber ich denke, das hattest Du so nicht auf dem Plan, stimmt's?

Macht man auch erst ab wenigstens einigen (zehn) Millionen Rows je Kindtabelle.
 
Jetzt stehe ich vor dem Nächsten Problem

Ist es möglich, in den Trigger einen weiteren Trigger zu schreiben ?

Also dass für die neue Tabelle die erstellt wird, einen Update trigger erstellt wird, der überprüft ob der Meldebestand eines Eintrages unterschritten wird ?
 
müsste ich dazu einfach nach dem CREATE TABLE

nochmal EXECUTE 'CREATE OR REPLACE TRIGGER....' schreiben oder ist das nicht möglich?


achso und zur Patitionierung eher nicht, hatten wir auch in den vorlesungen noch nicht... Trigger ist schon kompliziert genug für mich
 
müsste ich dazu einfach nach dem CREATE TABLE

nochmal EXECUTE 'CREATE OR REPLACE TRIGGER....' schreiben oder ist das nicht möglich?


achso und zur Patitionierung eher nicht, hatten wir auch in den vorlesungen noch nicht... Trigger ist schon kompliziert genug für mich

Dann würde ich das sein lassen. Wenn der Lehrer / Prof Dich auflaufen lassen will wird er Dich z.B. fragen, wie Du den Gesamtbestand über alle Lager ermitteln willst - in einer Konstellation, wo Du nicht weißt, welche überhaupt existieren.
 
oder da die lagertabellen bestandstabellen LAGER_1 LAGER_2 LAGER_3 heissen
und die zahlen jeweils der primärschlüssel des LAGER-Eintrages sind

könnte man nicht eine PL/SQL Function machen, die diese abfragt ?
 
Ja stimmt du hast schon recht... ich merke auch gerade dass das ganze irgendwie nicht Hand und Fus hat und ausserdem meine momentanten fähigkeiten übersteigen
 
dann werde ich besser eine Bestandstabelle die pro eintrag einen LAGER fremdschlüssel hat, damit wären die abfragen zumindest möglich... aber halt nicht so elegant die lösung ;(

trotzdem danke für deine hilfe
 
Werbung:
Wenn es nur darum geht einen (sinnvollen) Trigger zu schreiben würde ich einfach sagen die Produkttabelle sollte ein Logging bekommen und das per Trigger realisieren. Ich würde einfach sagen das ist ein sehr klassisches Anwendungsszenario und gar nicht mal so trivial wie du feststellen wirst :)
 
Zurück
Oben