Hallo PG Gemeinde,
der ein oder andere wird sich evtl. noch daran erinnern, ich interessiere mich für Rechte auf Spalten. Hehe, nun ist die neue PG Version 8.4 draussen und voila... es soll gehen. Rechte spaltenweise vergeben. Ok mein kurzes Testszenario:
TestTabelle->public darf alles
col1->testUser darf lesen
col2->testUser darf lesen
col3->testUser darf nur einfügen
Ok, nun wie nicht anderst zu erwarten sieht man als testUser die Werte in col3 natürlich trotzdem. Das will ich aber nicht. Wie kann man das machen? Wenn ich public von der Tabelle wegnehme geht gar nichts mehr... was auch logisch ist...
Für eine Weise eingebung bin ich dankbar ;-)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Also mein create sieht wie folgt aus:
ich weis nicht direkt was du meinst. Auf die Tabelle an sich sind gar keine Privilegien gesetzt.Code:CREATE TABLE testtabelle ( id integer NOT NULL, eins character varying, zwei character varying, drei character varying, CONSTRAINT testtabelle_pkey PRIMARY KEY (id) ) WITH ( OIDS=FALSE ); ALTER TABLE testtabelle OWNER TO postgres; GRANT ALL ON TABLE testtabelle TO postgres; GRANT INSERT(eins) ON testtabelle TO "testR"; GRANT SELECT(zwei) ON testtabelle TO "testR";
Nicht nur dem User. Vor allem auch PUBLIC die Rechte entziehen.
Steht unter anderem in meinem Buch ab Seite 80, spaltenbasierte Rechte ab Seite 86 ;-)
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
Also wenn ich der rolle Public nur insert gebe, bekomme ich en fehler wenn ich die tabelle abfragen will. Wenn ich die Roll Public nur leer lasse dann passiert gar nichts.
Dein Buch habe ich leider im Moment nicht zur Hand ;-) Ich spiele aber mit dem Gedanken es zu kaufen weil darin anscheinend steht wie man Rechte zeilenweise vergibt..... HUI
Wo exakt ist Dein Problem?Code:test=# create user "testR"; CREATE ROLE test=*# CREATE TABLE testtabelle test-# ( test(# id integer NOT NULL, test(# eins character varying, test(# zwei character varying, test(# drei character varying, test(# CONSTRAINT testtabelle_pkey PRIMARY KEY (id) test(# ) test-# WITH ( test(# OIDS=FALSE test(# ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "testtabelle_pkey" for table "testtabelle" CREATE TABLE test=*# ALTER TABLE testtabelle OWNER TO postgres; ALTER TABLE test=*# GRANT ALL ON TABLE testtabelle TO postgres; GRANT test=*# revoke all on testtabelle from "testR"; REVOKE test=*# GRANT INSERT(eins) ON testtabelle TO "testR"; GRANT test=*# GRANT SELECT(zwei) ON testtabelle TO "testR"; GRANT test=*# commit; COMMIT test=# \q kretschmer@tux:~$ psql test -U testR psql (8.4.0) Type "help" for help. test=> insert into testtabelle (eins) values(1); ERROR: null value in column "id" violates not-null constraint test=!> rollback; ROLLBACK test=> insert into testtabelle (id,eins) values(1,1); ERROR: permission denied for relation testtabelle test=!> \q kretschmer@tux:~$ psql test psql (8.4.0) Type "help" for help. test=# GRANT INSERT(id) ON testtabelle TO "testR"; GRANT test=*# commit; COMMIT test=# \q kretschmer@tux:~$ psql test -U testR psql (8.4.0) Type "help" for help. test=> insert into testtabelle (id,eins) values(1,1); INSERT 0 1 test=*> select eins from testtabelle ; ERROR: permission denied for relation testtabelle test=!> rollback; ROLLBACK test=>
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Ich habe jetzt exakt dein Listing bei mir eingefügt.
Ich meine das ist doch nicht normal oder? Ich erwarte das entweder nur id,zwei,drei angezeigt werden oder id,eins,zwei,drei und im Feld eins ist nichts drin. Ich meine was soll das denn sonst für einen Sinn ergeben? Was passiert bei dir wenn duCode:select * from testtabelle ERROR: permission denied for relation testtabelle select eins from testtabelle ERROR: permission denied for relation testtabellemachst?Code:select * from testtabelle
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Interessant.
Select zwei from Testtabelle geht, Select eins, zwei from testtabelle geht nicht. Ich meine Wenn ich eine Anwendung entwickle kann ich doch nicht hingehen und schreiben:
Wie soll man denn sowas in der Realität gut gebrauchen können?Code:select eins, zwei, drei from testtabelle if permission denied select zwei, drei from testtabelle
Du hast doch exakt dieses Verhalten gewollt, oder?
In der Realität prüft man halt, ob der User passende Rechte hat:
und:Code:test=*> select case when (select has_column_privilege(current_user, 'testtabelle', 'zwei', 'select') = true) then eins else 'permission denied' end from testtabelle; case ------------------- permission denied (1 row)
Selbes select, unterschiedliche Nutzer. Du kannst das auch als VIEW definieren.Code:test=# select case when (select has_column_privilege(current_user, 'testtabelle', 'zwei', 'select') = true) then eins else 'permission denied' end from testtabelle; case ------ 1 (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 ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen