PostgreSQL 9.3.13,如何用不同的使用者刷新物化視圖?
$$ I think the root cause of this problem is me not understanding permissions and privileges… $$ 所以,為了搭建舞台,我的設置是一個數據庫,稱之為MyDb。
我有兩個使用者,spu1和u1,spu1是超級使用者,u1是“普通”使用者。MyDb的所有者是spu1。我想我還應該說u1具有從組角色繼承的創建數據庫和創建角色權限。
我有一個模式sch1,它是一個使用者定義的模式。
在這個模式中,我有一個表,稱為tbl1和一個物化視圖,稱為mvw1。
tbl1的所有者是spu1,mvw1的所有者是u1。
問題:
在目前設置中,如上所述,我無法將mvw1刷新為u1或spu1。我只是得到了以下有趣的錯誤(我已經廣泛搜尋但沒有找到任何可以完全解決我的設置的東西..)。
ERROR: permission denied for relation tbl1 ********** Error ********** ERROR: permission denied for relation tbl1 SQL state: 42501
我發現
- 將mvw1的所有者更改為spu1 ,允許我刷新為spu1。
- 執行以下命令允許我將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 是否仍將作為定義器執行。