Ich möchte zur “Isolation” der Benutzer, diesen nur Zugriff in einem Schema gewähren. Allerdings soll darin natürlich auch die Datenbank liegen, mit der sie arbeiten sollen. Nun kann ich zwar die Datenbank (aus einem entsprechenden Template) anlegen, allerdings wird die Datenbank immer im Schema ‘public’ angelegt. Wie kann ich erreichen eine Datenbank (bzw. die darin befindlichen Tabellen) in dem speziellen Schema (aus dem template) anlegen zu lassen.
ein neues SCHEMA in einer Datenbank, z.B. postgres, kannst Du mit CREATE SCHEMA anlegen. Die Rechte für User werden mittels CREATE USER … und GRANT … definiert. Details muss Du in der Doku nachlesen.
Vielen Dank für Deine Antwort, aber ein Schema anlegen und Rechteverwaltung war nicht das grundlegende Thema, sondern "wie kann ich eine DATENBANK (aus einem Template) anlegen lassen, so das diese sofort Teil eines anderen Schema sind.
Du könntest dich mit dem search_path Einstellungen (siehe SET Optionen) beschäftigen. Damit legst du fest, welche Schemas der User von Haus aus sieht, wenn er kein Schema angibt.
Zugriffsbeschränkungen auf Schemata legst du normal mit GRANT/REVOKE an.
Allerdings fürchte ich nach dem Durchlesen deines Postings, das dies nicht ganz das ist, was du möchtest. Genauer konnte ich dein Problem leider auch nicht verstehen, vielleicht erläuterst du das einmal an einem Beispiel?
zum Verständnis: PostgreSQL kann 1…n DATENBANKEN erzeugen. Eine Datenbank kann 1…n SCHEMA enthalten.
CREATE DATABASE funktioniert eigentlich, indem es eine bestehende Datenbank kopiert. Wenn nichts anderes angegeben wurde, kopiert es die Systemdatenbank template1. Wenn in template1 ein SCHEMA PUBLIC enthalten, wird diese kopiert. Was hindert dich, in template1 das SCHEMA PUBLIC mittels ALTER SCHEMA einen neuen Namen zu geben oder ein zusätztliches SCHEMA in template1 anzulegen oder ein eigene Datenbank “template???” mit Deinen eigenen SCHEMEN anzulegen und diese als Vorlage zu verwenden?
also mit ALTER SCHEMA wurde mein Problem weitgehend gelöst.
Etwas unklar ist mir noch, warum ich den Owner von Tabellen noch ändern muss, wenn die Datenbank per Template für einen bestimmten USER angelegt wird. Hätte erwartet, dass die Tabellen dem selben User gehören, wie die Datenbank.
– Muss den Owner in einem zusätzlichen Lauf mit alter table … owner to … umsetzen
ich habe auch eine Frage zu “SCHEMA”. Ich denke es passt hier einigermaßen rein.
Ich habe ein SCHEMA folgendermaßen angelegt:
CREATE SCHEMA topo_geo;
Dann habe ich eine Tabelle in diesem SCHEMA angelegt.
CREATE TABLE topo_geo.test (test varchar(10))
Das hat alles funktioniert. Ich kann auch einen SELECT auf die Tabelle machen. Aber wieso bekomme ich die Tabelle nicht mit “\d” angezeigt? Ich bekomme auf diese Weise nur alle Tabellen, Sequenzen, etc. die in PUBLIC stehen.
Du musst dein Schema in den ‘search_path’ mit aufnehmen, damit \d dieses Schema mit in Betracht zieht. Setzen tust du den Parameter mit SET, siehe auch die Dokumentation für diesen Befehl.