Gar nicht.
Du kannst über Zugriffsrechte regeln, wer auf welche Tabelle oder welchen View zugreifen darf. Aber das die Tabellen oder Views vorhanden sind, kannst du nicht verstecken.
Hallo PG'ler
Ich möchte das wenn sich Leute aus der Rolle x anmelden diese die Tabelle Person sehen. Wenn sich Leute aus Y anmelden sollen sie statt Person die View PersonV sehen.
Kann ich sowas machen? Irgendwie Automatisch? mit Trigger? Script? Transaktion???
Wenn ja wie??
Vielen Dank im vorraus für die Eventuelle Antwort ;-)
Waldi
Gar nicht.
Du kannst über Zugriffsrechte regeln, wer auf welche Tabelle oder welchen View zugreifen darf. Aber das die Tabellen oder Views vorhanden sind, kannst du nicht verstecken.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Vielleicht versteh ich dich flasch.
Also, Du willst, daß User X was anderes als User Y sieht? Falls das _so_ ist:
In der Tabelle speicherst Du noch ein Feld für den aktuellen User. Wer sich anmeldet, setzt damit auch die Variable current_user. Und dann machst Du einen VIEW auf die Tabelle mit der Bedingung, daß Deine Spalte = current_user ist. Dann sieht X was anderes als User Y.
Die originale Tabelle sollte natürlich nicht für alle abfragbar sein...
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Es geht bei mir in erster Linie Darum:
Ich habe in der Tabelle Person Daten gespeichert die manche User nicht sehen dürfen/sollen. Andere User dürfen das sehen. Klar jetzt kann ich eine View erstellen in der nur die Daten stehen die alle sehen dürfen.
Wie soll ich das aber Programiertechnisch lösen? Die Benutzer loggen sich in meinem Programm ein. Woher soll das Programm samt den ganzen SQL Abfragen wissen das wenn der und der User angemeldet ist die Abfragen auf die View abgesetzt werden und bei den anderen Usern auf die Tabelle?
Daher kommt meine Frage. Kann man das irgendwie anderst lösen, anderst wie ich gedacht habe?? Es wäre ja eigentlich schon damit getan wenn man so eine Regel erstellen könnte Wenn du in dieser Tabelle nichts siehst dann guck doch bei der Tabelle/View
@akretschmer: Ich steig da noch nicht so ganz durch. Was steht denn in der extra Tabellenspalte?? Und dann kann ich alle Abfragen auf die View machen und der eine User bekommt alles von der Tabelle zu sehen und der andere nur ein Teil? Ich kann mir das bei deiner Methode irgendwie nicht so vorstellen.
PG weiß, wer eingeloggt ist. Dieses Wissen kann man nutzen.
@akretschmer: Ich steig da noch nicht so ganz durch. Was steht denn in der extra Tabellenspalte?? Und dann kann ich alle Abfragen auf die View machen und der eine User bekommt alles von der Tabelle zu sehen und der andere nur ein Teil? Ich kann mir das bei deiner Methode irgendwie nicht so vorstellen.AndreasCode:test=# create table geheim (username text, info text); CREATE TABLE Time: 148.329 ms test=*# insert into geheim values ('kretschmer', 'geheim1'); INSERT 0 1 Time: 5.369 ms test=*# insert into geheim values ('foo', 'geheim2'); INSERT 0 1 Time: 0.864 ms test=*# commit; COMMIT Time: 6.919 ms test=# create view view_geheim as select * from geheim where username=current_user; CREATE VIEW Time: 150.246 ms test=*# select * from view_geheim ; username | info ------------+--------- kretschmer | geheim1 (1 row) Time: 1.903 ms test=*# commit; COMMIT Time: 47.951 ms test=# \q kretschmer@KanotixBox:~$ psql -U foo test Timing is on. Welcome to psql 8.1.2, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit test=# select * from view_geheim ; username | info ----------+--------- foo | geheim2 (1 row)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Das ist wunderbar. Es gibt aber mehrere User soll ich dann mehrere Spalten anlegen??
Es geht bei mir nicht um zeilenweise beschränkung sondern nur um Spalten. Die einen User sollen alles sehen die anderen Nur Vor und Nachname.
Auf gut Deutsch ich muss in meinem Programm Schreiben. if (pguser == 1){select view} else {select tabelle};PG weiß, wer eingeloggt ist. Dieses Wissen kann man nutzen.
Ich weis nicht gibts da nicht wirklich was anderes??
Sorry das ich mich anscheinend so undeutlich ausdrücke.
Mal eine ernsthafte Frage: hast du dich einmal ernsthaft mit den Zugriffsbeschränkungen, die PG bereitstellt, auseinandergesetzt?
Du lässt halt niemanden direkt auf die Tabelle sondern stellst einen oder mehrere Views bereit. Je nach erlaubten Rechten kann ein User auf einen oder mehrere Views zugreifen und sieht damit genau die Spalten, die du ihm zu sehen erlaubst.
Wenn das dein Problem nicht löst, verstehe ich wohl dein Problem nicht richtig.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
mein Login matcht halt grad nicht auf 'erlaubt'...Code:test=# create table geheim (col1 int, col2 int, col3 int); CREATE TABLE test=*# create view view_geheim as select col1, case when current_user = 'erlaubt' then col2 else null end, col3 from geheim; CREATE VIEW test=*# insert into geheim values (1,2,3); INSERT 0 1 test=*# select * from geheim ; col1 | col2 | col3 ------+------+------ 1 | 2 | 3 (1 row) test=*# select * from view_geheim ; col1 | case | col3 ------+------+------ 1 | | 3 (1 row)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Ja das habe ich. Mir ist ja auch klar das ich Rechte auf eine View und Tabelle Legen kann. Das Híer ist mein eigentliche Problem:Mal eine ernsthafte Frage: hast du dich einmal ernsthaft mit den Zugriffsbeschränkungen, die PG bereitstellt, auseinandergesetzt?
Momentan ist es ja so das ich bei der einen Gruppe auf die View die Abfrage ausführen muss und bei den anderen auf die Tabelle. Das möchte ich halt verhindern, da dies ein sehr großer Implementierungsaufwand benötigen würde. Am einfachsten kann man sich die Sache so vorstellen: Ich mache Select * From Person. Bei der einen Gruppe bekomm ich nur den Vornamen und Namen zurück und bei den anderen eben alles.Wie soll ich das aber Programiertechnisch lösen? Die Benutzer loggen sich in meinem Programm ein. Woher soll das Programm samt den ganzen SQL Abfragen wissen das wenn der und der User angemeldet ist die Abfragen auf die View abgesetzt werden und bei den anderen Usern auf die Tabelle?
@Akretschmer: Dankeschön erstmal. Ich werde das mal versuchen. Wenn ich die ganze Sache geschafft habe Poste ich die Lösung. Aber ich muss die Abfrage hier ja auch entweder auf die View ausführen oder auf die Tabelle und das ist s.o. :-(
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen