У меня странная проблема с 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
Странно, нет?Есть идеи, почему это может быть?