Kann man den Speicherplatz unter Postgres quotieren ?
ja
nein
kaum
schlecht
0Teilnehmer
Hallo,
kann man unter Postgres den Speicherplatz für ein Schema oder einen User beschränken oder wenigstens abfragen ?
Habe bisher unter “pg_catalog.pg_settings” geschaut, aber keine entsprechende Option gefunden.
Nein, weil der Speicherplatz vom User belegt wird, dem der postmaster-Prozess gehört, also postgres. Du kannst allerdings reguläre Filesystemquotas nutzen, und Du kannst tablespaces nutzen.
Das Auslesen der Tabellengrößen hilft mir schon weiter.
Unklar ist mir noch das Modell des tablespace.
Kann ich da selbst eine Vorlage erstellen, die den Speicherplatz für einen User beschränkt ?
Nein. Der Speicherplatz gehört immer dem User ‘postgres’, mit Quota kommst du da also nicht direkt ran. Einziger Weg: du könntest jedem User Schreibrechte in einem anderen Tablespace geben - dann ist nur Platz für das zugewiesene Quota.
Wozu benötigst Du das einklich? Und was genau? Soll nur eine Tabelle begrenzt werden oder hast Du N User und jeder darf nur M GByte Platte belegen oder was möchtest Du erreichen?
Wird schwer zu realisieren sein. Wenn es nicht so zeitkritisch ist, vielleicht via Cron die Größen überwachen und handeln (Mail, fernzünden einer Bombe, …), aber vielleicht hat ads ja noch eine Idee.
wenn es doch möglich ist, den Speicherplatz einer Table zu erfragen, dann sollte es auch möglich sein, mit dieser Funktion (what ever) eine Constraint auf der Table zu basteln. Das schöne an dieser Idee ist auch, dass man vernünftige Fehler beim Schreiben in die Table erwarten darf.
muss der fkt pg_tablespace_size(‘foo’) natuerlich der Name des Tablespace und nicht der Table uebergeben werden - glaube ich zumindest - aber im Prinzip sollte es so gehen … das ‘foo’ ist dort also falsch
Wenn du den von dir vorgeschlagenen Constraint erzeugst, wird der nur bei Datenänderungen in der betroffenen Tabelle ausgeführt.
Wenn ein $böser User sich selbst eine Tabelle erzeugt und da Daten reinschreibt, ist von deinem Constraint nichts zu sehen.
Da der OP den Platzverbrauch im Schema begrenzen will und nicht jede Tabelle (samt Constraint) vorgeben möchte, wird deine Idee also so nicht funktionieren.
ob der user natuerlich selbst die betroffenen Tables erzeugen darf … hab ich entweder uebersehen oder ist nicht der fall …
wie dem auch sei … da existieren ja noch eine reihe anderer funktionen … er koennte z.B. eine trigger-funktion fuer den tablespace bauen, der (geht das ?) alle inserts auf allen tables des schemas triggert und bei bedarf eben in einen fehler laeuft …
– Nachtrag –
sehe gerade … man kann auch eine C-Library durch einen trigger aufrufen … die koennte dann sehr effizient tun was gewuenscht ist … den speicherplatz berechnen … und boesse exceptions werfen - dazu muesste man sich aber mal anschauen wie die auf
vielleicht reicht aber auch schon plsql code.
leider wird man aber keine trigger auf ein schema setzen koennen …
die Größe einer Tabelle als Datei hängt von einigen Faktoren ab. Ich werfe hier mal schnell als Stichwort ‘dead tuple’ und ‘MVCC’ sowie ‘TOAST’ ein. Nicht jede Lösung, die allzu offensichtlich ist, ist auch gut. Hint: je nach Gusto kannst Du mal N und mal M Datensätze in die DB einfügen. Das zumindest wäre so aus Sicht des Anwenders der Fall. Und an die Adresse des Fragestellers einer meiner Sprüche: