Учитывая роль базы данных, user1
функцию, something()
определенную как хранимая процедура, и представление, созданное следующим образом:
CREATE VIEW view1 AS select * from something()
И, учитывая это разрешения:
REVOKE ALL ON FUNCTION something FROM user1
REVOKE SELECT ON view1 FROM user1
Когда я бегу SELECT * FROM view1
, я получаю ошибку permission denied for function something()
.
Мой вопрос: если я отменяю права на выборку для представления, почему вызывается функция? Я ожидал получить что-то вроде:
permission denied for relation view1
Спасибо!
postgresql
permissions
view
santios
источник
источник
something()
функцией. Быстрый тест состоял бы в том, чтобы изменить запрос таким образом, чтобы вы получили другой план объяснения, соответствующим образом скорректировав разрешения, а затем посмотрите, не возникла ли ошибка разрешения вsomething()
функции или следует ли, как новый план выполнения переоценивается.Ответы:
Проблема в этом случае не совсем в порядке разрешения, а в порядке выполнения.
В резюме, для PostgreSQL:
1. Представления, которые обрабатывают таблицы, переопределят разрешение таблиц.
2- Функции доступа к представлениям должны будут оценить все функции перед проверкой - поэтому функции должны выполняться перед обработкой представления, даже если представление не имеет разрешений выбора ...
Как мы можем доказать это?
В postgresql представления могут дать вам разрешения на выбор в таблице, даже если у пользователя нет этих разрешений.
Например:
Войдите как пользователь 1:
В этом случае пользователь сможет выбрать view2, даже не имея разрешения на выбор таблицы.
Но что если мы сделаем то же самое с функцией ? Поведение НЕ одинаковы. Давайте создадим функцию, которая ждет 5 секунд, прежде чем вернуть 1 (поэтому мы можем отлаживать, если postgresql запускает функцию каждый раз, когда мы вызываем представление)
Войдите как пользователь 1:
Разрешение на выбор в представлении не отменяет разрешение функции, и даже в худшем случае, если мы отзовем разрешения у view1, сообщение все равно показывает, что postgresql остановил наш запрос из-за функции, независимо от того, какое разрешение у представления. (это именно то, что происходит в вопросе)
Но действительно ли функция проверяется первой? Если мы дадим «все» разрешения для функции, но отзовем разрешение на просмотр ...
Как вы видите, postgresql WAITED 5 SECONDS перед тем, как сказать, что у нас нет разрешения на вывод представления , показывает, что выполняется функция " thing () ". Поэтому функция возврата данных должна существовать до проверки представления.
Итак, теперь с этими тестами мы теперь знаем, что PostgreSQL нужно было сначала оценить все функции, прежде чем продолжить наш запрос, точно так же, как запрос все еще не существует, пока все функции не будут полностью завершены, поэтому представление не может быть решено для postgresql для знать, есть ли у нас разрешение на его выбор.
Я думаю, что это ответ на ваш вопрос в терминах «порядка разрешений», но почему postgresql должен оценить все функции, прежде чем продолжить, вот другой вопрос ...
источник