Tabelle mit variablem Name aus Trigger erstellen

Heavy-Dee

Benutzer
Beiträge
5
Hallo zusammen,
als Newbie habe ich folgende Frage.

In einer Tabelle 1 wird ein Datensatz angelegt. Darin befindet sich eine Spalte 'orgid' (unique).
Nun möchte ich einen Trigger erstellen, der bei Anlage des DS eine Tabelle 2 erstellt, deren Name die 'orgid'
beinhaltet.
DS Tab1: 'orgid' = 352617 ==> create Tab2: "data_352617"

d.h. Für jede eingetragene Organisationseinheit soll eine eigene Datentabelle erstellt werden.

Mein Ansatz sieht wie folgt aus,

CREATE TRIGGER `create_data` AFTER INSERT ON `organ`
CREATE TABLE IF NOT EXISTS `data_NEW.orgid` (
`datakey` int(6) NOT NULL,
`fk_userid` varchar(32) NOT NULL,
...
`fk_comkey` int(6) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8

phpmyadmin gibt mir folgenden Fehler aus:
  • MySQL meldet: #1422 - Explicit or implicit commit is not allowed in stored function or trigger
... bringt mich aber nicht weiter.

Kann das überhaupt funktionieren?

Gruß
DIRK
 
Werbung:
Ich würde mal das INSERT Statement in eine Variable packen und es mit execute() versuchen, sollte eigentlich gehen.

Individuelle Tabellen für gleichartige Organisationseinheiten klingt aber nicht nach gutem Design und kann schnell zu vielen Problemen bei Abfragen führen. Das würde ich nicht unbedingt empfehlen.
 
  • MySQL meldet: #1422 - Explicit or implicit commit is not allowed in stored function or trigger
... bringt mich aber nicht weiter.

Kann das überhaupt funktionieren?

Gruß
DIRK


LOL. Hier stolpert MySQL über sich selbst, mal wieder. Da es keine transaktionale DDL kann, kommt da ein Autocommit innerhalb der Trigger-Funktion.

Prinzipiell würde das, was Du willst, gehen. In PostgreSQL z.B. Wäre mal lustig zu wissen, ob es in Oraggle ginge - das kann auch kein transaktionales DDL, soweit ich weiß.

Andererseits ist natürlich hier der (Un)Sinn der Aktion zu hinterfragen, ein Design, welches je Datensatz eine neue Tabelle anlegt ist vermutlich Schmarrn.
(erinnert mich aber an ein Posting hier in der Oraggle-Gruppe von mir vor wenigen Tagen, wo es um eigene Zähler je dem Wert einer anderen Spalte ging)
 
... Andererseits ist natürlich hier der (Un)Sinn der Aktion zu hinterfragen, ein Design, welches je Datensatz eine neue Tabelle anlegt ist vermutlich Schmarrn.

mag sein das es Unsinn ist, aber ich würde es gerne aus Gründen der Übersichtlichkeit so realisieren.

Leider verstehe ich von euren Statements nur Bahnhof.
Bin kein Programmierer und auf Basis mySQL weis ich mir nur mit phpmyadmin zu helfen.
Sicherlich könnte ich mein Vorhaben in php realisieren, aber ich wollte halt versuchen den Code nicht weiter aufzublähen und dieses, sofern möglich direkt in der Datenbank abzuwickeln.
Seht mir meine Unwissenheit bitte nach.
 
mag sein das es Unsinn ist, aber ich würde es gerne aus Gründen der Übersichtlichkeit so realisieren.
Übersichtlichkeit? Wenn Du dann bei N Datensätzen N identische Tabellen hast, die sich nur im Namen unterscheiden? Das ist, sorry, kompletter Müll.
Wenn Du aufgrund der Menge von Datensätzen partitionieren willst dann geht das anders. Aber ich glaube nicht, daß Du in einer Situation bist, das zu brauchen.

Leider verstehe ich von euren Statements nur Bahnhof.

Dann frag konkret.

Bin kein Programmierer und auf Basis mySQL weis ich mir nur mit phpmyadmin zu helfen.

Du hast den Ehrgeiz, viel in der DB machen zu wollen. Das ist gut und richtig. Die Wahl mit MySQL halte ich da allerdings schon für einen groben Fehler.

Andreas
 
akretschmer zweifelt aber an dem Erfolg der Lösung und könnte Recht haben, ich kenne mich mit MySQL nicht so gut aus. Wenn es mit Dynamic SQL nicht geht, dürfte es keinen Weg geben das umzusetzen.

Demo in PostgreSQL:

Code:
test=# create table heavy(id int, val text);
CREATE TABLE
Time: 4,201 ms
test=*# create or replace function create_table() returns trigger as $$begin execute 'create table heavy_' || new.val || ' (id int, val text)'; return new; end; $$language plpgsql;
CREATE FUNCTION
Time: 0,602 ms
test=*# create trigger trg1 before insert on heavy for each row execute procedure create_table();
CREATE TRIGGER
Time: 0,764 ms
test=*# \d heavy_foo;
Did not find any relation named "heavy_foo".
test=*# insert into heavy values (1, 'foo');
INSERT 0 1
Time: 3,240 ms
test=*# \d heavy_foo;
  Table "public.heavy_foo"
 Column |  Type  | Modifiers
--------+---------+-----------
 id  | integer |
 val  | text  |
 
@akretschmer Funzt auch in Oracle ab 12 ... :)
@Heavy-Dee Irgendwie erkenne ich nicht was du unter "Übersichtlich" verstehst...
Ich finde eine Tabelle in der alles steht WESENTLICH übersichtlicher als n-Tabellen mit jeweils 10-100 Datensätzen...
Aber wenn du deine Datenbank vergewaltigen willst... Bitte. Tu dir keinen Zwang an ^^
 
Werbung:
Zurück
Oben