【发布时间】:2019-03-07 17:55:28
【问题描述】:
我正在尝试计算数据库中所有表中的行数。由于我想得到的答案必须区分不同的模式,因此我还考虑了特定表所在的模式。
这个answer 很有帮助,但事实证明我没有访问数据库中所有模式的权限。
我知道我可以通过执行以下查询来检查我对特定表或架构的权限:
select count(*) from (
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name='data' and privilege_type = 'SELECT') as foo
并检查输出是否等于或大于一。
我现在的代码如下:
CREATE or replace function rowcount_all(schema_name text default 'public')
RETURNS table(table_name_var text, cnt bigint) as
$$
declare
table_name_var text;
begin
for table_name_var in SELECT c.relname FROM pg_class c
JOIN pg_namespace s ON (c.relnamespace=s.oid)
WHERE c.relkind = 'r' AND s.nspname=schema_name
loop
if (
select count(*) from (
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name=table_name_var and privilege_type = 'SELECT') as foo
) >= 1 then
RETURN QUERY EXECUTE format('select cast(%L as text),count(*) from %I.%I',
table_name_var, schema_name, table_name_var);
end if;
END loop;
end
$$ language plpgsql;
在执行以下查询时
WITH rc(schema_name,tbl) AS (
select s.n,rowcount_all(s.n) from (values ('schema1'),
('schema2'), ('schema3'), ('schema4')) as s(n)
)
SELECT schema_name,(tbl).* FROM rc;
我收到一个错误,ERROR: permission denied for relation table1 其中table1 在我无权访问的架构中。我认为我在 IF 语句中的逻辑不会过滤掉我无权访问的表。
【问题讨论】:
标签: postgresql count schema database-table