Hi, und zwar hab ich eine Tabelle, die ca. 50 mio datensätze mit sich bringt. Jetzt möchte ich einen bestimmten Wert für bestimmte Nutzer nicht zugänglich machen (d.h. nicht sperren/verbieten, sondern eher als 0-Wert deklarieren).
D.h. wenn ein “select hidden_field from table” kommt, soll für einen bestimmten nutzer der Wert 0 sein und für einen anderen User der richtige wert.
Sollte das nicht funktionieren, könnte man doch einen View anlegen und in diesem View das feld als 0-Feld nach außen freigeben - die Frage ist hierbei, wieviel speed geht bei einer solch großen Tabelle (für an View) flöten…
Würde mich über ein paar Ideen freuen.
Also für das Problem hab ich mal diese Lösung gefunden. Bei mir funktioniert es auch so. Man macht eine View die alle sehen können und diese ist mit einer Regel belegt das Person X - wenn sie die Rechte auf die Tabelle hat, alles sehen kann und falls nicht null für definierte Felder zurückgegeben wird.
Wie es mit der Performance aussieht kann ich dir allerdings nicht sagen. Das wissen andere bestimmt besser “schiel(Akretschmer, ads)”.
Hier der Link
http://www.pg-forum.de/benutzer-rechteverwaltung/1172-view-oder-tabelle-je-nach-user.html
Gruss Waldi
Alles klar, danke. Würd mich auch für die performance interessieren…
Wie werden denn Views angelegt? Sind sie noch bestandteil der Lokalen Tabelle oder werden sie wirklich 1zu1 erstellt?.. das würde heißen, dass nochmals 10GB beansprucht werden?
Im Prinzip sind Views nichts anderes als Abfragen die ansprechbar sind wie Tabellen. Also würden nicht noch einmal 10 GB anfallen. So etwas ist aber auch schnell erstellt. Dann kannst du ja die Geschwindigkeit testen. Ich meine Geschwindigkeiteinbussen die man nicht bemerkt sind ja kein Problem.
hi, jep werd ich versuchen. besten dank.
Kleine frage hätte ich noch.
current_user
gibt es auch ne möglichkeit die gruppe von diesem user auszulesen.
Also ich hab da keine Funktion dafür gefunden aber das ist auch nicht weiter schlimm weil du die Rechtezuweisung in Gruppen organisieren kannst. Die Regel funktioniert so: Wenn der momentane Benutzer rechte auf die Tabelle XYZ hat dann zeige alles an, wenn nicht gib für die und die Felder null zurück. Somit kannst du einer ganzen Gruppe Rechte auf die Tabelle geben, die sehen dann alles und die anderen nur das was du definiert hast. Abfragen tust du im übrigen immer die View.
Okay hört sich soweit vernünftig an. die view’s funktionieren auch wunderbar mit 2-4 GB Tabellen.
Kurze Frage, wie frag ich ab, ob der User rechte für den view hat?
Ich glaube wir reden aneinander vorbei. Ich hab mir den Thread nochmal angeschaut und da steht meine Lösung mit der View und der Tabelle so gar nicht richtig drin. Das mit der Funktion ist bei mir damals gar ned gegangen aus Programmiertechnischen gründen. Die Lösung von der ich rede muss ich hier mal posten. Dann kannst du es machen wie ich dir oben beschrieben habe. Hier mal der Ansatz:
create view view_geheim as
select col1, col2…
case when current_user = “variable für benutzer hat rechte auf die Tabelle xyz” then col2 else null end, col3 from geheim;
So ähnlich. Ich poste es dir heut Abend noch.
Okay alles klar. d.h. nur der benutzer, der in current_user() abgefragt wird, hat die berechtigung…
Noch eine Frage, wie kann ich zb. ein Feld überschreiben?
dachte so könnte es gehen, wird jedoch nicht akzeptiert:
select *, field as 0
from table;
Hier das genau Problem:
create or replace view view_customers as
select *, cash as null
from customers;
Fehlermeldung:
FEHLER: kann Anzahl der Spalten in Sicht nicht ändern
SQL state: 42P16
Hab es gelöst mit:
field1,cast('0.0' as real) as my_field
Ok hier der Befehl zum Createn der View
CREATE OR REPLACE VIEW person AS
SELECT persont.peid, persont.vorname, persont.nachname, persont.geschlecht,
CASE
WHEN has_table_privilege('persont', 'select') = true
THEN persont.jahrgang
ELSE NULL
END AS jahrgang,
CASE
WHEN has_table_privilege('persont', 'select') = true
THEN persont.strasse
ELSE NULL
END AS strasse
FROM persont;
person ist die View
persont ist die Tabelle
Die Rechtevergabe machst du auf die Tabelle, Die Abfragen auf die View. Der Rest macht SQL für dich. Wenn ein Feld vorher Strasse hies und nun als str angezeigt werden soll kannst du das im END AS Teil umsetzen. Statt “strasse” schreibst du hier “str” rein.
Hi, wirklich super. Besten Dank!!