[psql] mag een sequence niet gebruiken bij een ON INSERT rul

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ROcho
  • Registratie: April 2008
  • Laatst online: 08-04 21:36
Ik heb in postgresql (8.1) een database met verschillende schema's en verschillende users. Elke user heeft z'n eigen schema en kunnen niet in elkaars schema kijken. Dmv. views wissel ik gegevens uit tussen de verschillende schema's (vaak ook wel met een join erin). Deze views hebben als eigenaar een superuser, waardoor de informatie beschikbaar kan zijn.
Nu heb ik een tabel van user A waar user B schrijfrechten zou moeten hebben. Dit is op zich prima op te lossen met rules. Aangezien de rule wordt uitgevoerd door de eigenaar van de view (dus de superuser) werkt dit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
postgres=# \d meester.tabelnaam;
                                  Table "meester.tabelnaam"
 Column |       Type        |                           Modifiers               
--------+-------------------+----------------------------------------------------------------
 id     | integer           | not null default nextval('meester.tabelnaam_id_seq'::regclass)  kolom  | character varying |

postgres=# \d slaaf.viewnaam
         View "slaaf.viewnaam"
 Column |       Type        | Modifiers
--------+-------------------+-----------
 id     | integer           |
 kolom  | character varying |
View definition:
 SELECT tabelnaam.id, tabelnaam.kolom
   FROM meester.tabelnaam;
Rules:
 oninsert AS
    ON INSERT TO slaaf.viewnaam DO INSTEAD  INSERT INTO meester.tabelnaam (kolom)
  VALUES (new.kolom)
 onupdate AS
    ON UPDATE TO slaaf.viewnaam DO INSTEAD  UPDATE meester.tabelnaam SET kolom = new.kolom
  WHERE tabelnaam.id = new.id

postgres=# \z slaaf.viewnaam
             Access privileges for database "postgres"
 Schema |   Name   | Type |            Access privileges
--------+----------+------+-----------------------------------------
 slaaf  | viewnaam | view | {rogier=arwdRxt/rogier,pils=arw/rogier}
(1 row)


Hierboven staat dus de testopstelling. Volgens mij zou op deze manier user pils via slaaf.viewnaam een select, update en insert kunnen doen in meester.tabelnaam. Ik heb 't eerst geprobeerd als superuser...

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
postgres=# INSERT INTO slaaf.viewnaam (kolom) VALUES ('joink');
INSERT 0 1
postgres=# SELECT * FROM slaaf.viewnaam ;
 id | kolom
----+-------
  1 | twat
  2 | joink
(2 rows)
postgres=# UPDATE slaaf.viewnaam SET kolom = 'twiet' WHERE id = 2;
UPDATE 1
postgres=# SELECT * FROM slaaf.viewnaam ;
 id | kolom
----+-------
  1 | twat
  2 | twiet
(2 rows)


Dit werkt dus. (note: id 1 stond er al in... ;))
Nu proberen als user pils
code:
1
2
3
4
5
6
7
8
9
10
postgres=> UPDATE slaaf.viewnaam SET kolom = 'twiedel' WHERE id = 2;
UPDATE 1
postgres=> SELECT * FROM slaaf.viewnaam ;
 id |  kolom
----+---------
  1 | twat
  2 | twiedel
(2 rows)
postgres=> INSERT INTO slaaf.viewnaam (kolom) VALUES ('joink');
ERROR:  permission denied for sequence tabelnaam_id_seq


Daar is dus mijn probleem. Rules werken prima, totdat ik een sequence gebruik.

Voor de duidelijkheid nog even dat een insert wel kan werken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
postgres=> \d slaaf.view2
           View "slaaf.view2"
 Column |       Type        | Modifiers
--------+-------------------+-----------
 kol1   | character varying |
 kol2   | character varying |
View definition:
 SELECT tabel2.kol1, tabel2.kol2
   FROM meester.tabel2;
Rules:
 oninsert AS
    ON INSERT TO slaaf.view2 DO INSTEAD  INSERT INTO meester.tabel2 (kol1, kol2)
  VALUES (new.kol1, new.kol2)
postgres=> INSERT INTO slaaf.view2 (kol1, kol2) VALUES ('joink', 'twiedel');
INSERT 0 1
postgres=> SELECT * FROM slaaf.view2
postgres-> ;
 kol1  |  kol2
-------+---------
 joink | twiedel
(1 row)


Ik zou verwachten dat als je een rule hebt, dit wordt uitgevoerd als de user die eigenaar is van de rule , maar kennelijk doen ze een ander geintje waardoor de sequence opgevraagd wordt als de user die het uitvoert. Of zie ik soms iets over 't hoofd?
Dan de oplossing... hoe kan ik dit fixxen. Ik kan natuurlijk met de hand een sequence maken en die exporteren dmv. een view, maar dat lijkt me omslachtig (voor zover mn huidige opzet 't nog niet is :)).

Acties:
  • 0 Henk 'm!

  • ROcho
  • Registratie: April 2008
  • Laatst online: 08-04 21:36
Hmm.. 't lijkt op een known-bug....
http://archives.postgresq...bugs/2005-02/msg00244.php