尽管有正确的权限,为什么我可以选择视图定义而不选择视图本身?

时间:2010-11-01 18:41:19

标签: sql postgresql permissions views

我在Windows Server 2003 SP2上的PostgreSQL 9.0.1上遇到了一个奇怪的问题。

我以超级用户身份连接,然后将SET SESSION AUTHORIZATION连接到用户 “X”是继承的组角色“extranet_user”的成员 来自组角色“user”的成员资格。 “X”,“extranet_user”,甚至 “用户”都是INHERIT。

我有以下观点:

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 :(得分:0)

结果重新启动pgAdminIII以某种方式修复它。在第一次遇到此错误后的某个时刻,我将extranet_user的权限更改为继承,结果没有更改。今天早上我启动了pgAdminIII,复制了这篇文章中的代码,然后就可以了。