从计算操作访问领导节点类型

Accessing leader node types from compute operations

我构建了一个独立运行的完美视图。 但是,它来源 pg_class & pg_namespace,它们仅具有领导节点数据类型。 (在视图中,我已经从这些数据类型中提取了我需要的值并将这些值转换为 varchar。)

我现在需要创建一个调用视图的过程,并将其数据 return 发送给调用者。 我仍然是红移新手,但我认为错误是因为 SProc 使用的计算节点不喜欢我的数据源是仅领导者。

Warnings:

Column "b.relacl" has unsupported type "aclitem[]". Column "b.nspacl" has unsupported type "aclitem[]".

An error occurred when executing the SQL command: CALL myschema.permissions_sp('info_results')

ERROR: list_nth_cell: invalid index into list Where: SQL statement "create temp table info_results as select .....

正在寻找有关如何将这些数据提供给我的最终用户的指导!!

对于后台,我通过过程执行,因为 pg_class & pg_namespace 自然只会显示基于调用者身份的结果行,并且过程允许我使用“SECURITY DEFINER”和 return 所有行。

谢谢

程序:

CREATE OR REPLACE PROCEDURE myschema.permissions_sp(INOUT tmp_name character varying(256))
 LANGUAGE plpgsql
 SECURITY DEFINER
AS $$
BEGIN
  EXECUTE 'drop table if exists ' || tmp_name;
  EXECUTE 'create temp table ' || tmp_name || ' as select schema_name,schema_owner,grantee_type,grantee,p_usage,p_create,object_name,perms,p_select,p_update,p_insert,p_delete,p_truncate,p_references,p_trigger,p_rule from myschema.homebrew_stv';
  EXECUTE 'GRANT SELECT on table ' || tmp_name || ' TO myuser';
END;
$$
/

查看:

create or replace view myschema.homebrew_stv
as

select 
  case when (s.schema_name in ('information_schema','pg_catalog','pg_toast','pg_internal')) or (s.schema_name like 'pg_temp_%')  then 1 end as issys,
  cast(s.schema_name as varchar(256)) schema_name,
  cast(s.schema_owner as varchar(256)) schema_owner,
  s.grantee_type,
  cast(s.grantee as varchar(256)) grantee,
  s.p_usage,
  s.p_create,
  cast(t."object" as varchar(256)) "object_name",
  cast(t.perms as varchar(256)),
  t.p_select,
  t.p_update,
  t.p_insert,
  t.p_delete,
  t.p_truncate,
  t.p_references,
  t.p_trigger,
  t.p_rule
from 
  myschema.homebrew_schema_xtended s
  left outer join 
  myschema.homebrew_tv_xtended t
  on 
    s.schema_name = t.schema_name and 
    s.grantee_type = t.grantee_type and 
    s.grantee = t.grantee
 where s.grantee <> 'rdsdb'

information_schema.columns

table_schema table_name column_name data_type

myschema homebrew_stv p_rule integer
myschema homebrew_stv p_trigger integer
myschema homebrew_stv p_references integer
myschema homebrew_stv p_truncate integer
myschema homebrew_stv p_delete integer
myschema homebrew_stv p_insert integer
myschema homebrew_stv p_update integer
myschema homebrew_stv p_select integer
myschema homebrew_stv p_create integer
myschema homebrew_stv p_usage integer
myschema homebrew_stv issys integer
myschema homebrew_stv perms character varying
myschema homebrew_stv object_name character varying
myschema homebrew_stv grantee character varying
myschema homebrew_stv grantee_type character varying
myschema homebrew_stv schema_owner character varying
myschema homebrew_stv schema_name character varying

最后的简单解决方案...只需使用游标而不是临时文件 table。

BEGIN
  OPEN rs_out FOR select schema_name,schema_owner,grantee_type,grantee,p_usage,p_create,object_name,perms,p_select,p_update,p_insert,p_delete,p_truncate,p_references,p_trigger,p_rule from myschema.homebrew_stv;
END;