ich pack euch einfach mal den code rein, vielleicht weiß jemand Rat.
meine Variable soll fsidwert heißen. und dann später mittels der zahl Tabellen und Regeln erstellen.
create or replace function testtrigger() returns TRIGGER AS '
Declare
fsidwert integer;
Begin
Select currval('fsid') INTO fsidwert;
create table fs_hourly_fsidwert
CHECK (fsid = fsidwert) INHERITS(fs_hourly);
create rule fs_hourly_fsidwert_rule
AS ON INSERT TO fs_hourly
WHERE fsid = fsidwert
DO INSTEAD INSERT INTO
fs_hourly_fsidwert (fsid, datum, mean_used, sum_used, mean_Free, sum_free, n)
VALUES (new.fsid, new.datum, new.mean_Used, new.sum_used, new.mean_Free, new.sum_free, new.n);
...
paar mehr sachen
...
End;
' LANGUAGE 'plpgsql';
ich pack euch einfach mal den code rein, vielleicht weiß jemand Rat.
meine Variable soll fsidwert heißen. und dann später mittels der zahl Tabellen und Regeln erstellen.
Vorweg: so, wie du das versuchst, kann es nicht gehen. Um das zu machen, mußt Du dynamisches SQL ausführen, also, Du bastelst Dir einen String, der Dein SQL enthält, und führst diesen mittels EXECUTE aus.
create or replace function testtrigger() returns TRIGGER AS ’
Declare
fsidwert integer;
Begin
Select currval(‘fsid’) INTO fsidwert;
>
Das ist schon mal so für sich gesehen kein gültiges SQL, um eine Tabelle zu erstellen.
Was genau willst Du erreichen, Table-Partitionierung?
\
\
Andreas
habe ich jetzt auch gemerkt. sry
dann jetzt hoffentlich besser:
also ich versuche die Funktion zu erstellen. sprich ich kopier die gesamt funktion in mein frontend hinein. dann kommt die fehlermeldung:
ERROR: syntax error at or near “fsid” at character 120
das dürfte der zeile:
Select currval('fsid') INTO fsidwert;
entsprechen.
fsid ist in meiner tabelle der pk, fals das wichtig sein sollte.
für mich anscheind schon
damit kann ich grad nicht soviel anfangen
meinst du das?
CREATE TRIGGER tafter
AFTER INSERT ON hostfsmap
FOR EACH ROW EXECUTE PROCEDURE testtrigger()
bisher habe ich alle meine Tabellen so erstellt.
und die existieren und funktionieren auch
anstatt fsidwert steht halt nur eine Zahl da.
EDIT
ok mir ist grad aufgefallen dass meine klammern um Check herum fehlen. meintest du das damit?
/EDIT
Was genau willst Du erreichen, Table-Partitionierung?
jopps das wollte ich erreichen und habe ich auch schon.
jedoch sollen die tabellen und regeln halt “automatisch” erstellt werden wenn ein neues filesystem in der parents table hinzugefügt wird
hat natürlich nicht funktioniert
aber das wusstest du bestimmt ja.
habe jetzt alles abgeändert und getestet → es läuft
hier nochmal der code fals andere ein ähnliches problem mal haben
create or replace function testtrigger() returns TRIGGER AS '
Declare
fsidwert integer;
sql text;
Begin
sql := '' Select fsid from hostfsmap order by fsid desc limit 1'';
execute sql into fsidwert;
raise notice ''deine fsid: %'', fsidwert;
sql := ''create table fs_hourly_''||fsidwert||'' (CHECK (fsid ='' || fsidwert || '')) INHERITS(fs_hourly)'';
execute sql;
sql := ''create rule fs_hourly_''||fsidwert||''_rule
AS ON INSERT TO fs_hourly
WHERE fsid = '' || fsidwert ||
'' DO INSTEAD INSERT INTO
fs_hourly_''||fsidwert||'' (fsid, datum, mean_used, sum_used, mean_Free, sum_free, n)
VALUES (new.fsid, new.datum, new.mean_Used, new.sum_used, new.mean_Free, new.sum_free, new.n)'';
execute sql;
return null;
End;
' LANGUAGE 'plpgsql';
aber eine Frage habe ich noch
wenn ich es mit $$ probiere am Anfang und am ende bekomme ich einen fehler
monitoring=> create or replace function testtrigger() returns TRIGGER AS $$
monitoring-> Declare
monitoring-> fsidwert integer;
ERROR: unterminated dollar-quoted string at or near "$$
musste es daher mit ’ schreiben… woran könnte dieser fehler liegen?
Das Dollar-Quoting ist zu bevorzugen, weil Du dann innerhalb der Funktion keine doppelten ’ verwenden mußt. Macht die Sache übersichtlicher. Und erklärt auch Deinen Fehler.
Das ich dann keine doppelten ’ verwenden muss ist mir klar. Habe ich bei dem Test auch nicht. Trotzdem kam dieser Fehler. Wollte das ja gerne mit Dollar-Quting machen nur dann kam ja halt der Fehler und ich musste alles auf ‘’ ändern und das Dollar-Quoting entfernen.
ich bin zwar nen Anfänger in sachen postgres und triggern… aber die hatte ich auch am Ende drin
kann ja spaßenshalber ma kurz was testen
create or replace function testtrigger() returns TRIGGER AS $$
Declare
fsidwert integer;
sql text;
Begin
sql := ' Select fsid from hostfsmap order by fsid desc limit 1';
execute sql into fsidwert;
sql := 'create table fs_hourly_'||fsidwert||' (CHECK (fsid =' || fsidwert || ')) INHERITS(fs_hourly)';
execute sql;
sql := 'create rule fs_hourly_'||fsidwert||'_rule
AS ON INSERT TO fs_hourly
WHERE fsid = ' || fsidwert ||
' DO INSTEAD INSERT INTO
fs_hourly_'||fsidwert||' (fsid, datum, mean_used, sum_used, mean_Free, sum_free, n)
VALUES (new.fsid, new.datum, new.mean_Used, new.sum_used, new.mean_Free, new.sum_free, new.n)';
execute sql;
return null;
End;
$$ LANGUAGE 'plpgsql';
Fehler:
monitoring=> create or replace function testtrigger() returns TRIGGER AS $$
monitoring-> Declare
monitoring-> fsidwert integer;
ERROR: unterminated dollar-quoted string at or near "$$
Declare
fsidwert integer;" at character 61
monitoring=> sql text;
ERROR: syntax error at or near "sql" at character 3
monitoring=> Begin
monitoring-> sql := ' Select fsid from hostfsmap order by fsid desc limit 1'
;
ERROR: syntax error at or near "sql" at character 13
monitoring=> execute sql into fsidwert;
ERROR: syntax error at or near "into" at character 17
monitoring=>
monitoring=>
monitoring=>
monitoring=> sql := 'create table fs_hourly_'||fsidwert||' (CHECK (fsid =' |
| fsidwert || ')) INHERITS(fs_hourly)';
ERROR: syntax error at or near "sql" at character 5
monitoring=> execute sql;
ERROR: prepared statement "sql" does not exist
monitoring=>
monitoring=> sql := 'create rule fs_hourly_'||fsidwert||'_rule
monitoring'> AS ON INSERT TO fs_hourly
monitoring'> WHERE fsid = ' || fsidwert ||
monitoring-> ' DO INSTEAD INSERT INTO
monitoring'> fs_hourly_'||fsidwert||' (fsid, datum, mean_used, sum_used, mea
n_Free, sum_free, n)
monitoring'> VALUES (new.fsid, new.datum, new.mean_Used, new.sum_used, new.m
ean_Free, new.sum_free, new.n)';
ERROR: syntax error at or near "sql" at character 5
monitoring=> execute sql;
ERROR: prepared statement "sql" does not exist
monitoring=>
monitoring=> return null;
ERROR: syntax error at or near "return" at character 5
monitoring=> End;
WARNING: there is no transaction in progress
COMMIT
monitoring=> $$ LANGUAGE 'plpgsql';
ERROR: unterminated dollar-quoted string at or near "$$ LANGUAGE 'plpgsql';" at
character 1
monitoring=>
interessant…
woran kann das dann liegen, dass der bei mir so rum zickt?
habs eben extra nochma alles in eine zeile gepackt sodass der keine zeilenumbrüche oder so hat
monitoring=> create or replace function testtrigger() returns TRIGGER AS $$ Decl
are fsidwert integer; sql text; Begin sql := ' Select fsid from hostfsmap order
by fsid desc limit 1'; execute sql into fsidwert; sql := 'create table fs_hourl
y_'||fsidwert||' (CHECK (fsid =' || fsidwert || ')) INHERITS(fs_hourly)'; execut
e sql; sql := 'create rule fs_hourly_'||fsidwert||'_rule AS ON INSERT TO fs_hour
ly WHERE fsid = ' || fsidwert || ' DO INSTEAD INSERT INTO fs_hourly_'||fsidwert|
|' (fsid, datum, mean_used, sum_used, mean_Free, sum_free, n) VALUES (new.fsid,
new.datum, new.mean_Used, new.sum_used, new.mean_Free, new.sum_free, new.n)'; e
xecute sql; return null; End; $$ LANGUAGE 'plpgsql';
ERROR: unterminated dollar-quoted string at or near "$$ Declare fsidwert integ
er;" at character 61
ERROR: syntax error at or near "sql" at character 2
ERROR: syntax error at or near "sql" at character 8
ERROR: syntax error at or near "into" at character 14
ERROR: syntax error at or near "sql" at character 2
ERROR: prepared statement "sql" does not exist
ERROR: syntax error at or near "sql" at character 2
ERROR: prepared statement "sql" does not exist
ERROR: syntax error at or near "return" at character 2
WARNING: there is no transaction in progress
COMMIT
ERROR: unterminated dollar-quoted string at or near "$$ LANGUAGE 'plpgsql';" at
character 2
monitoring=>
Ich mach ja ungern soviel Werbung, aber dieses Thema behandle ich nächste Woche ausführlich in München. Ansonsten zeigte akretschmer schon, dass deine Funktion eigentlich funktioniert.