Postgresql, що дозволяє розширення без суперкористувача


13

У мене є сервер PostgreSQL 9.5, на якому я маю сценарії, які автоматично створюють ролі та бази даних для користувачів. У цих базах даних було б корисно ввімкнути конкретні розширення (наприклад, pgcrypto), але, наскільки я це розумію, потрібно запустити суперпользователя CREATE EXTENSION. Чи є спосіб увімкнути такі розширення без вручного входу в обліковий запис суперпользователя?


4
Ви спробували додати їх, template1а потім створити кожну базу даних користувачів на template1зразок CREATE DATABASE foo OWNER=userfoo TEMPLATE=template1?
Кассандрі

1
@Kassandry ніхто про це не думав, але гарна думка. В ідеалі я хотів би, щоб власники могли додати розширення за бажанням, але це все-таки прийнятна можливість.
beldaz

Відповіді:


10

З документів про розширення,

суперусер (булевий) Якщо цей параметр є істинним (за замовчуванням), лише суперпользователи можуть створити розширення або оновити його до нової версії. Якщо встановлено значення false, потрібні лише права, необхідні для виконання команд у сценарії встановлення чи оновлення.

Значення не встановлено pgcrypto.control, тому воно за замовчуванням відповідає справжньому, для чого потрібен SuperUser.

Це означає, що ви не можете бути CREATE EXTENSIONпростим власником бази даних, незважаючи на те, що документи про CREATE EXTENSION змушують вас повірити.

Я дуже намагався налаштувати це false, і ніякої радості. С - це ненадійна мова, і ви отримаєте

ПОМИЛКА: дозвіл відмовлено в мові c

Від документів на pg_language

Лише суперкористувачі можуть створювати функції в ненадійних мовах.

... звичайно, ви можете cдовіряти собі UPDATE pg_language set lanpltrusted = true where lanname = 'c';як суперпользователя. Тоді CREATE EXTENSION pgcryptoбуде добре працювати як не-суперпользователь. Але це звучить як погана ідея, якщо вам доведеться турбуватися про те, щоб ваші користувачі завантажили джерело до каталогу розширень, а потім встановили його в базі даних. Тобто я б не пішов так далеко. Я знайшов би інший спосіб зіштувати цю кішку.


Дякую, Еване, це така ретельна відповідь, як я міг би попросити. Я, мабуть, обратимуться до пропозиції щодо котячої шкіри @ Кассандрі, щоб обійти це питання. Я також думав над тим, як перетворити CREATE EXTENSION у збережену процедуру, але не зміг знайти шлях до того, щоб зробити цю роботу в тій самій базі даних без примхливості автентифікації dblink.
beldaz

Який сенс у тому, щоб не мати жодної опції, pg_dumpщоб запобігти демпінгу заяв щодо розширень? На даний момент я маю використовувати зовнішні інструменти для обробки тексту, щоб видалити ці висловлювання з SQL, на який скидається pg_dump.
Клавдікс

@ Еван Керролл: чи можна встановити суперусер на значення false через psql cli? У мене є екземпляр Amazon Aws RDS і не маю доступу до pgcrypto.control.
рибамар

2
@ribamar ні, тому що це означатиме, що кожен, хто підключився до бази даних, може виконувати буквальне довільне виконання коду як db postmaster. це була б жахлива ідея.
Еван Керролл

не хто-небудь, суперпользователь. Я розумію, що таким чином ви відрізняєте операційну систему супер від супер-користувача dbms, хоча, якби я приймав таке рішення, я б пішов на розширення інструменту, і якщо б дійсно потрібно було створити ще одного більш потужного користувача, я би реалізував його всередині інструменту.
рибамар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.