Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Zugriff auf Spalten

  1. #1
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard Zugriff auf Spalten

    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 ;-)

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    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 ;-)
    Entziehe dem testUser erst mal alles und erlaube ihm dann das, was erlaubt sein soll.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    Also mein create sieht wie folgt aus:

    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";
    ich weis nicht direkt was du meinst. Auf die Tabelle an sich sind gar keine Privilegien gesetzt.

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.055

    Standard

    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

  5. #5
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    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

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    Also mein create sieht wie folgt aus:

    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";
    ich weis nicht direkt was du meinst. Auf die Tabelle an sich sind gar keine Privilegien gesetzt.
    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=>
    Wo exakt ist Dein Problem?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    Ich habe jetzt exakt dein Listing bei mir eingefügt.

    Code:
    select * from testtabelle
    ERROR: permission denied for relation testtabelle
    select eins from testtabelle
    ERROR: permission denied for relation testtabelle
    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 du
    Code:
    select * from testtabelle
    machst?

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    Ich habe jetzt exakt dein Listing bei mir eingefügt.

    Code:
    select * from testtabelle
    ERROR: permission denied for relation testtabelle
    select eins from testtabelle
    ERROR: permission denied for relation testtabelle
    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 du
    Code:
    select * from testtabelle
    machst?
    In produktivem Einsatz hat ein 'select *' nun einmal exakt nix zu suchen.
    Ein 'select *' wird vom planner automatisch gewandelt in ein select über alle Spalten, das 'permission denied' ist also logisch.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    waldi ist offline Benutzer
    Registriert seit
    22.12.2006
    Beiträge
    67

    Standard

    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:

    Code:
    select eins, zwei, drei from testtabelle
    if permission denied
    select zwei, drei from testtabelle
    Wie soll man denn sowas in der Realität gut gebrauchen können?

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von waldi Beitrag anzeigen
    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:

    Code:
    select eins, zwei, drei from testtabelle
    if permission denied
    select zwei, drei from testtabelle
    Wie soll man denn sowas in der Realität gut gebrauchen können?
    Du hast doch exakt dieses Verhalten gewollt, oder?

    In der Realität prüft man halt, ob der User passende Rechte hat:

    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)
    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
    ------
     1
    (1 row)
    Selbes select, unterschiedliche Nutzer. Du kannst das auch als VIEW definieren.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Dynamischer Zugriff auf RECORD
    Von stargaizer im Forum PL/pgSQL
    Antworten: 2
    Letzter Beitrag: 19.02.2011, 14:54
  2. PHP-Zugriff auf PostgreSQL-DB
    Von Chuqa im Forum Programmierung
    Antworten: 7
    Letzter Beitrag: 20.12.2007, 06:36
  3. Remote Zugriff
    Von mari im Forum Konfiguration
    Antworten: 3
    Letzter Beitrag: 08.11.2007, 14:01
  4. Zugriff auf Tabelle fkt nicht!
    Von Riesenspast im Forum SQL
    Antworten: 7
    Letzter Beitrag: 06.06.2007, 18:12
  5. Flexibler Zugriff
    Von zed_leppelin im Forum Benutzer- & Rechteverwaltung
    Antworten: 3
    Letzter Beitrag: 02.03.2007, 07:18

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum