DDL von Objekten anderer Schemata in gleicher Datenbank verstecken?

Hallo liebe Helfer,

eine Schulungsumgebung wollte ich wie folgt aufbauen:

CREATE DATABASE veranstaltungsname

CREATE USER student1...
CREATE SCHEMA student1 AUTHORIZATION student1

CREATE USER student2...
CREATE SCHEMA student2 AUTHORIZATION student2

So kann student1 zwar nicht die Daten von student2 einsehen, aber immer noch die DDL der Datenbankobjekte von student2. Genau die DDL ist aber Teil der Übungen, die die Studenten unabhängig voneinander lösen sollen.

Kann ich die DDL der Objekte in anderen Schemata der gleichen Datenbank verstecken?

Oder muss ich je eine Datenbank pro Student anlegen, um hier eine harte Trennung durch zu setzen? Das würde mein Ziel zwar erreichen, wäre aber in der Bedienung und Administration deutlich unkomfortabler.

Vielen Dank im Voraus für eure Mühen!

Ungetestet: mittel REVOKE dem PUBLIC das USAGE entziehen.

Andreas

Selbst wenn du die Rechte an Schema und Tabelle den anderen Benutzern entziehst, können diese immer noch die Struktur der Tabelle einsehen.

Mit einem

REVOKE USAGE ON SCHEMA student1 FROM public

funktioniert es leider nicht, und da all meine Recherchen keine Möglichkeit ergaben, bin ich geneigt, ads Recht zu geben. Verbleibt mir die (unkomfortable) Option separater Datenbanken.

Danke für eure Antworten.

Ich weiß jetzt nicht, was da an der Administration komplizierter sein soll.

Bei der Bedienung stimme ich dir zu: der Admin muss erst mal die Datenbank wechseln, bevor er Objekte eines Nutzers einsehen kann.

“Komplizierter” würde ich es auch nicht nennen, nur eben unkomfortabler, aufwändiger.

Die Studenten sollen unter anderem Views bzgl. gemeinsam genutzer Daten speichern. Mit einem Schema pro Student und thematisch sortierten Schemata für die gemeinsamen Daten wären Abfragen wie

CREATE VIEW student1.v1 AS
   SELECT * FROM gemeinsames_schema1.tabelle1

ja auch kein Problem. Wenn die Studenten allerdings eigene Datenbanken bekommen sollen, kann ich die gemeinsam genutzten Daten nicht analog in eine eigene Datenbank mit ihren thematischen Schemata auslagern. Denn PostgreSQL unterstützt in der eingesetzten Version 8.x keine Cross-Datenbank-Abfragen (und für die 9.0.1 habe ich noch nichts Gegenteiliges gefunden):

CREATE VIEW student1.public.v1 AS
   SELECT * FROM gemeinsame_datenbank.gemeinsames_schema1.tabelle1

Deshalb habe ich (unkomfortabler- und aufwändigerweise) vor, die gemeinsam genutzten Daten in die jeweiligen Studenten-Datenbanken in entsprechende Schemata zu kopieren. Immerhin scheinen die gemeinsam genutzten Daten über den Verlauf der Lehrveranstaltung hinweg unverändert zu bleiben.

Stimmt. Cross-Datenbank Anfragen sind nicht vorgesehen.

Ich habe es nicht ausprobiert, aber was passiert denn, wenn man das SELECT Recht auf die entsprechende System Kataloge wegnimmt?

Das mag funktionieren (ungetestet), aber dann gehen natürlich auch solche Abfragen, die die eigenen Tabellen betreffen, nicht mehr.

Andreas