Update nur auf bestimmte (eigene) Datensätze?

Sorry, falsches Forum - siehe:[h=1]Forum: Benutzer- & Rechteverwaltung[/h]

Du speicherst pro Datensatz auch noch den User, der den erstellt hat. (via TRIGGER) Und Du schreibst Dir eine Stored Procedure (Security Definer), der diese Updaten darf. (diese prüft, ob current_user = erstellen - User ist). Vorher aber wechselst Du das RDBMS gegen PostgreSQL. That’s all.


Andreas

Hallo,

ich habe folgendes Problem zu lösen (und ich komm nicht drauf wie):

Ich greife mit dem NPGSQL Connector durch eine ASPX Webseite auf den SQL Server zu, die Zugriffsrechte auf die Tabellen werden alle auf Datenbankebene behandelt.
Der User darf neue Datensätze anlegen, diese aber nicht wieder verändern oder Löschen.
Oft werden beim Eingeben banale Fehler gemacht, die der User selbst ausbessern möchte. Mit den oben genannten Rechten (nur INSERT) kann er das nicht und muss sich an einen Super-User wenden, der den Fehler dann ausbessert.
Nun soll der User aber die Möglichkeit haben selbst erstellte Datensätze auch wieder zu verändern (nicht zu Löschen) um Fehler selbst ausbessern zu können. Aus Sicherheitsgründen soll er das eben nur bei den Datensätzen können, die er selbst erstellt hat!

Ich hab überhaupt keine Idee, wie ich dieses Problem lösen könnte.

Kann mir jemand helfen?

Dank und Gruß
Stomper

Ohaa - das ging ja schnell ^^ - da du Mod bist, vielleicht kannst du Ordnung in meinem Chaos posting schaffen (hab noch mal ins andere Froum gepostet).

Ich schau mal was ich durch Google/Bücher usw. mit den Begriffen anfangen kann und melde mich dann ggf. später noch mal.

DANKE

Xandrian: Themen zusammengeführt…

Du nutzt schon PostgreSQL, oder? Hab Dich vorhin wohl flasch verstanden, sorry.

Also, Part1 du speichert den User, der den Satz erstellt, mittels Trigger:

test=# create table stomper (id int, val text, ersteller text);
CREATE TABLE
test=*# create or replace function set_ersteller() returns trigger as $$begin new.ersteller = current_user; return new; end; $$ language plpgsql;
CREATE FUNCTION
test=*# create trigger trg1 before insert on stomper for each row execute procedure set_ersteller();
CREATE TRIGGER
test=*# insert into stomper values (1, 'test', 'Du kannst mich mal');
INSERT 0 1
test=*# select * from stomper ;
 id | val  | ersteller
----+------+-----------
  1 | test | root
(1 row)

Ja, ich bin ‘root’ in dem Falle, …

Dann entziehst Du alle Rechte, also daß der User kein Update/Delete machen darf, und erstellst dann eine Function (als ein User, der Update-rechte hat) und definierst diese als ‘Security Definer’. Das überlasse ich Dir jetzt zur Übung :wink:

Andreas

will mal nicht so sein …

test=# create or replace function edit() returns bool as $$begin raise notice '% %', current_user, session_user; return 1; end;$$language plpgsql security definer;
CREATE FUNCTION

andere Session:

[root@akretschmer ~]# psql -U kretschmer test
Pager is always used.
**********************
* AUTOCOMMIT ist AUS *
**********************
psql (9.2devel)
Type "help" for help.

test=> select * from edit();
NOTICE:  root kretschmer
 edit
------
 t
(1 row)

Andreas

Ok, also schreibe ich mir eine eigene Edit() Funktion mit Security definer, die dann die Felder Updatet, wenn der current user gleich dem gespeichertem dataset creator ist, richtig?

Oder wie war das gemeint?

Dank und Gruß
Stomper

Jein. Current_user ist innerhalb der SECURITY DEFINER - Function gleich dem Definer, was Du suchst steht in meinem Beispiel :wink:

Andreas

yo - session user natürlich :smiley:

Danke für die Tipps!