错误:必须是物化视图 PostgreSQL 的所有者

Bor*_*rsn 5 postgresql view materialized-views

我收到以下错误:

ERROR:  must be owner of materialized view mv_sessions
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

当尝试刷新我的物化视图时:

REFRESH MATERIALIZED VIEW CONCURRENTLY partners.mv_sessions;
Run Code Online (Sandbox Code Playgroud)

的所有者mv_sessions是我的自定义master用户。partner我已将所有权限分配给我尝试刷新视图的子用户。

我不想成为partner的所有者mv_sessions。还有其他子用户需要能够刷新视图。


我尝试使用触发功能:

BEGIN
    REFRESH MATERIALIZED VIEW CONCURRENTLY partners.mv_sessions;
    RETURN NULL;
END 
Run Code Online (Sandbox Code Playgroud)

得到同样的错误:

psycopg2.errors.InsufficientPrivilege: must be owner of materialized view mv_sessions
CONTEXT:  SQL statement "REFRESH MATERIALIZED VIEW CONCURRENTLY partners.mv_sessions"
PL/pgSQL function partners.refresh_mv_sessions() line 3 at SQL statement
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Bor*_*rsn 8

导致问题的函数:

CREATE OR REPLACE FUNCTION partners.refresh_mv_sessions()
RETURNS TRIGGER LANGUAGE plpgsql
AS $$
BEGIN
    REFRESH MATERIALIZED VIEW CONCURRENTLY partners.mv_sessions;
    RETURN NULL;
END $$;
Run Code Online (Sandbox Code Playgroud)

SECURITY DEFINER根据此答案(如 Marth 建议)进行修复,以便非所有者可以刷新物化视图:

CREATE OR REPLACE FUNCTION partners.refresh_mv_sessions()
RETURNS TRIGGER
SECURITY DEFINER
AS $$
BEGIN
    REFRESH MATERIALIZED VIEW CONCURRENTLY partners.mv_sessions;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)