Почему я могу выбрать определение представления, но не само представление, несмотря на правильные разрешения? - PullRequest
0 голосов
/ 01 ноября 2010

У меня странная проблема с PostgreSQL 9.0.1 на Windows Server 2003 SP2.

Я подключаюсь как суперпользователь, а затем УСТАНАВЛИВАЮ СЕРТИФИКАЦИЮ СЕССИИ для пользователя "X", который является членом групповой роли "extranet_user", которая наследует членство от групповой роли "пользователь".«X», «extranet_user» и даже «пользователь» - все Унаследованы.

У меня есть следующее представление:

CREATE OR REPLACE VIEW page_startup AS 
 SELECT contact.name, contact.nickname, COALESCE( 
        CASE 
            WHEN has_table_privilege('mandate'::text, 'select'::text) 
THEN ( SELECT false AS bool 
               FROM mandate 
       NATURAL JOIN task 
         WHERE task.waiting_for = "session_user"()::text::integer AND 
task.deadline < now() 
        LIMIT 1) 
            ELSE NULL::boolean 
        END, true) AS no_mandates 
   FROM contact 
  WHERE contact.id = "session_user"()::text::integer; 
GRANT SELECT ON TABLE page_startup TO "user"; 

Если я запусту это:

set session authorization "X"; 
select pg_has_role('user','member') 

В результате я получу 't'.Кроме того, если я запускаю это (просто копируя определение представления):

set session authorization "X"; 
 SELECT contact.name, contact.nickname, COALESCE( 
        CASE 
            WHEN has_table_privilege('mandate'::text, 'select'::text) 
THEN ( SELECT false AS bool 
               FROM mandate 
       NATURAL JOIN task 
         WHERE task.waiting_for = "session_user"()::text::integer AND 
task.deadline < now() 
        LIMIT 1) 
            ELSE NULL::boolean 
        END, true) AS no_mandates 
   FROM contact 
  WHERE contact.id = "session_user"()::text::integer; 

Я получаю единственную строку данных, которую я ищу.

Однако если я попытаюсь использовать представление вместо копирования его определения:

set session authorization "X"; 
select * from page_startup 

Я получу следующее:

ERROR:  permission denied for relation page_startup 
********** Error ********** 
ERROR: permission denied for relation page_startup 
SQL state: 42501 

Странно, нет?Есть идеи, почему это может быть?

1 Ответ

0 голосов
/ 02 ноября 2010

Оказывается перезапуск pgAdminIII как-то исправил.В какой-то момент после первого появления этой ошибки я изменил разрешения extranet_user на наследование, и результаты не изменились.Сегодня утром я запустил pgAdminIII, скопировал код из этого поста, и он заработал.

...