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

PL/SQL: Mit Trigger nach Insert neues Table erstellen

Dieses Thema im Forum "Oracle" wurde erstellt von alexrausch, 24 Juli 2014.

  1. alexrausch

    alexrausch Benutzer

    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: 24 Juli 2014
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. alexrausch

    alexrausch Benutzer

    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ß
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. alexrausch

    alexrausch Benutzer

    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 ?
     
  6. alexrausch

    alexrausch Benutzer

    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
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  8. alexrausch

    alexrausch Benutzer

    würde eigentlich keinen Sinn ergeben, da jede Filiale ein Lager hat.
     
  9. akretschmer

    akretschmer Datenbank-Guru

    In welcher Filiale ist Teil 08/15 vorrätig?
     
  10. alexrausch

    alexrausch Benutzer

    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 ?
     
  11. alexrausch

    alexrausch Benutzer

    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
     
  12. alexrausch

    alexrausch Benutzer

    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
     
  13. akretschmer

    akretschmer Datenbank-Guru

    Was gefällt Dir daran nicht? Ist IMHO die nomalste Sache der Welt...
     
  14. ukulele

    ukulele Datenbank-Guru

    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 :)
     
    quinoman gefällt das.
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