Postgresql

PostgreSQL 9.3.13,如何用不同的使用者刷新物化視圖?

  • January 28, 2021

$$ I think the root cause of this problem is me not understanding permissions and privileges… $$ 所以,為了搭建舞台,我的設置是一個數據庫,稱之為MyDb

我有兩個使用者,spu1u1spu1是超級使用者,u1是“普通”使用者。MyDb的所有者是spu1。我想我還應該說u1具有從組角色繼承的創建數據庫和創建角色權限。

我有一個模式sch1,它是一個使用者定義的模式。

在這個模式中,我有一個表,稱為tbl1和一個物化視圖,稱為mvw1

tbl1的所有者是spu1mvw1的所有者是u1

問題:

在目前設置中,如上所述,我無法將mvw1刷新為u1spu1。我只是得到了以下有趣的錯誤(我已經廣泛搜尋但沒有找到任何可以完全解決我的設置的東西..)。

ERROR:  permission denied for relation tbl1
********** Error **********

ERROR: permission denied for relation tbl1
SQL state: 42501

我發現

  1. 將mvw1的所有者更改為spu1 允許我刷新為spu1
  2. 執行以下命令允許我將mvw1刷新為u1

我試圖找出我需要授予普通使用者u1哪些缺少的權限(理想情況下是所需的最低權限) ,以便我可以在以他們身份登錄時刷新此視圖。

第一個選項雖然很高興知道,但並不能解決我的問題。第二個選項似乎我實際上是在向非超級使用者授予超級使用者權限,或者授予比我需要的更大的權限。

如果有人可以向我解釋這裡到底發生了什麼(或指出我在解決問題所需的問題描述中遺漏了哪些資訊),並讓我知道我的第二個選擇是否確實可行還是更好的選擇?

非常感謝!

您可以使用在其所有者的安全上下文中執行的函式來執行此操作。

刷新視圖的函式(使用擁有 MV/表的使用者創建它):

CREATE OR REPLACE FUNCTION refresh_mvw1()
RETURNS void
SECURITY DEFINER
AS $$
BEGIN
REFRESH MATERIALIZED VIEW mvw1 with data;
RETURN;
END;
$$ LANGUAGE plpgsql;

將函式上的執行權限授予您希望能夠刷新視圖的任何使用者:

-- Users have 'execute' permissions by default on functions!
revoke all on function refresh_mvw1() from public;
grant execute on function refresh_mvw1() to u1;

刷新:

select refresh_mvw1();

來自Postgres 文件

SECURITY DEFINER 指定該函式將以創建它的使用者的權限執行。

支持參數的版本:

CREATE OR REPLACE FUNCTION refresh_mv_xxx(table_name text)
RETURNS void
SECURITY DEFINER
AS $$
DECLARE sql text; 
BEGIN
sql := 'REFRESH MATERIALIZED VIEW ' || table_name || ' with data';
EXECUTE sql;
RETURN;
END;
$$ LANGUAGE plpgsql;

…但我不確定動態 SQL 是否仍將作為定義器執行。

引用自:https://dba.stackexchange.com/questions/171932