0

Прежде всего, я не могу воссоздать этот пример в скрипте 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; 
+0

Возможно ли, что у вас нет разрешения на доступ к information_schema.routines, но вы видите только тогда, когда вас проблемы обновите его. – Edmon

+0

@Edmon Нет, поскольку представления действуют с привилегиями владельца представления –

+0

@Edmon, все операторы выполнялись как суперпользователь, который также имеет роль table_owner. Поэтому здесь не должно быть проблем с правами ... –

ответ

1

REFRESH MATERIALIZED VIEW выполняется с привилегиями владельца вида, т.е. table_owner в этом случае. Пользователь не имеет доступа к некоторым функциям, поэтому он не видит некоторых записей в information_schema.routines.

Вы можете проверить, какие функции не доступны table_owner путем выполнения этого запроса в качестве суперпользователя:

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 

EXCEPT 

SELECT * FROM function_def; 

 Смежные вопросы

  • Нет связанных вопросов^_^