У меня есть таблица журнала, которая собирает изменения таблицы с помощью hstore. Что-то подобное:
CREATE TABLE "gt_wells"."log_edits" (
"well_gid" SERIAL
, "modified_by" TEXT
, "edit" HSTORE
);
где «редактировать» — это разница между предыдущим и новым значениями записи. Все работает так, как ожидалось.
Я хочу выбрать строки, в которых был отредактирован определенный столбец, поэтому, используя мою роль входа с правами суперпользователя, я могу успешно запустить:
SELECT DISTINCT "well_gid"
FROM "gt_wells"."log_edits"
WHERE "edit" ? 'full_sized_class;
Но когда я запускаю его из другой роли, я получаю неизвестную ошибку оператора:
SET ROLE "inl-trigger";
SELECT DISTINCT "well_gid"
FROM "gt_wells"."log_edits"
WHERE "edit" ? 'full_sized_class' AND "modified_by" != 'inl-trigger';
RESET ROLE;
Error : ERROR: operator does not exist: public.hstore ? unknown
LINE 3: WHERE "edit" ? 'full_sized_class' AND "modified_by" != 'inl-...
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Приведение «full_sized_class» к TEXT
не помогает. Расширение hstore существует в базе данных, и я дал привилегии «inl-trigger» для типа hstore:
CREATE EXTENSION hstore;
Error : ERROR: extension "hstore" already exists
GRANT ALL ON TYPE hstore TO "inl-trigger";
Affected rows : 0, Time: 0.00sec
Если я сделаю «inl-trigger» суперпользователем, все будет работать как положено. Итак, каких привилегий мне не хватает? Почему «inl-trigger» не может использовать операторы hstore?