Система прав и привилегий 🔐
Да, она отличается от Oracle.
Как минимум бросается в глаза выдача грантов на объекты.
Рассмотрим на простом примере.
1️⃣ Создадим функцию, которая использует внутри себя таблицу my_tab (пару постов назад мы её создавали и наполняли).
create or replace function get_note(p_id my_tab.id%type)
returns my_tab.note %type as $$
select note from my_tab t where t.id = p_id;
$$ language sql;
2️⃣ Создадим еще одного юзера в нашей БД
create user mydb_app password 'apppass';
3️⃣ Попробуем выполнить функцию под новым пользователем
select my_schema.getNote(1);
ERROR: permission denied for schema my_schema
LINE 1: select my_schema.getNote(1);
Упс… не хватает прав на использование схемы my_schema 🤷🏻♂️
4️⃣ Дадим грант на схему
grant usage on schema my_schema to mydb_app;
Вызовем функцию, получим следующую ошибку:
ERROR: permission denied for table my_tab
CONTEXT: SQL function "getnote" statement 1
5️⃣ Дадим грант на таблицу
grant select on my_tab to mydb_app;
Выполним и получим результат:
mydb=> select my_schema.getNote(1);
getnote
---------
text 1
(1 row)
Ура! Все работает 👍
Получилось немного витиевато. В Oracle:
🔹не требуется выдавать отдельно грант на использование схемы;
🔹нужно выдать грант на execute функции;
🔹не нужны гранты на каждый объект, который используется внутри функции (за некоторыми исключениями).
Если окунуться в документацию, то можно обнаружить множество отличий в системе прав от Oracle.
Продолжение следует 🎓
#postgresql
Oracle Developer