Прежде всего, я не могу воссоздать этот пример в скрипте SQL, я получил некоторую ошибку, когда я пытаюсь выбрать из представления.Представленный материал в формате Postgres скрывает некоторые данные
Проблема:
У меня есть материализованное представление, которое извлекает параметры функции из моей схемы, основанной на information_schema
. Когда я его создаю, он работает отлично. Когда я обновляю его, он работает отлично. Когда я назначаю его какой-то роли, а затем обновляю его - он теряет около 75% своего содержимого, а обновление не работает. Единственное, что работает, - это падение и повторное создание всего представления.
Примеры:
Все примеры были выполнены как суперпользователь. Допустим, что у меня есть роль:
CREATE ROLE table_owner NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
И я материализованное представление, как это:
CREATE MATERIALIZED VIEW function_def AS
SELECT
regexp_replace(r.specific_name::text, '^(.*)_[0-9]+$'::text, '\1'::text) AS function_name,
r.data_type AS output_type,
r.type_udt_name AS output_udt_name,
p.ordinal_position,
p.parameter_name,
p.data_type,
p.udt_schema,
regexp_replace(p.udt_name::text, '^_'::text, ''::text) AS udt_name
FROM information_schema.routines r
LEFT JOIN information_schema.parameters p ON p.specific_name::text = r.specific_name::text
WHERE 1 = 1 AND p.specific_schema::text = 'mySchema'::text
ORDER BY regexp_replace(r.specific_name::text, '^(.*)_[0-9]+$'::text, '\1'::text), p.ordinal_position
WITH DATA;
CREATE INDEX i_function_def_function_name ON function_def(function_name);
И позволяет сказать, что в этой точке высказыванием:
SElECT count(*) FROM function_def
возвращает 231 строк, которые это правильный номер. Затем я назначаю право собственности на определенную роль:
ALTER TABLE function_def OWNER TO table_owner;
и выберите все еще возвращает 231 строку, которая является правильным числом.
SElECT count(*) FROM function_def;
но когда я обновить вид, как это:
REFRESH MATERIALIZED VIEW function_def WITH DATA;
, а затем:
SElECT count(*) FROM function_def;
возвращаемое количество строк постоянна 54, которая не является правильным.
Я довольно озадачен здесь и буду признателен за помощь или намек. Является ли это ошибкой postgres, или я делаю что-то неправильно?
EDIT - решение:
Как заявил Клин это на самом деле проблема привилегия! Потому что все мои функции принадлежат function_owner, этот код сделал трюк, и теперь все в порядке:
ALTER TABLE function_def OWNER TO function_owner;
GRANT SELECT ON TABLE function_def TO GROUP table_owner;
Возможно ли, что у вас нет разрешения на доступ к information_schema.routines, но вы видите только тогда, когда вас проблемы обновите его. – Edmon
@Edmon Нет, поскольку представления действуют с привилегиями владельца представления –
@Edmon, все операторы выполнялись как суперпользователь, который также имеет роль table_owner. Поэтому здесь не должно быть проблем с правами ... –