powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедуры, триггеры и права...
14 сообщений из 14, страница 1 из 1
Процедуры, триггеры и права...
    #39970640
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица, которая при вставке данных триггером обновляет другую таблицу.
Имеется процедура, которая вставляет данные в первую таблицу.
Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает.

Теперь я вызываю процедуру через аккаунт, у которого нет прав на обновление второй таблицы и получаю ошибку, что у него нет прав на обновление второй таблицы, причём в 0й строке процедуры, когда она ещё даже не начала выполняться.

И самое вкусное: если я процедуре даю права на обновление второй таблицы, то она всё равно не выполняется, потому что нет прав на обновление второй таблицы...

Вопрос: это баг или фича и как это можно обойти?
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970644
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Впрочем, как обойти я придумал, вопрос почему права процедуры игнорируются...
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970647
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpвопрос почему права процедуры игнорируются...

Потому что ты не перезагрузил кэш метаданных, наверное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970662
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

вторую таблицу обновляет триггер первой таблицы, так ?
При чём тут права процедуры ?
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970690
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
alekcvp,

вторую таблицу обновляет триггер первой таблицы, так ?
При чём тут права процедуры ?


1. Если я даю права триггеру - всё работает (логично).
2. Если я даю права процедуре - не работает.
3. Если я даю права пользователю, который выполняет процедуру - внезапно всё снова работает.

В чём принципиальное различие 2. и 3.?..
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970694
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

пользователь->процедура->таблица1->триггер->таблица2

права не наследуются по цепочке.
если дать права процедуре на таблицу1, то у триггера таблицы1 нет прав обновлять таблицу2
если дать права пользователю (какие именно права?) на процедуру, то дальше процедуры тоже не пойдет.
таким образом,
1. можно дать юзеру права на всё - процедуру, таблицу1 и таблицу2, тогда всё работает.
2. нужно давать права: пользователю на процедуру, процедуре на таблицу1, триггеру на таблицу2.

p.s. конечно, раньше были какие-то косяки с правами, может что-то где-то затерялось.
Но я бы все права почистил, и повторил эксперимент почетче. А то что в первом, что в последнем сообщении не уточняется, кому именно какие права даются.

p.p.s. насчет вашего пункта 3 - а как же
"Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает."
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970696
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
В чём принципиальное различие 2. и 3.?..
Проверяются права пользователя и права того объекта, который выполняет операцию.
Права объектов не передаются другим объектам при выполнении.
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970767
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
p.p.s. насчет вашего пункта 3 - а как же
"Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает."

Вот и мне интересно - а как же?
В триггере стоит проверка на контекстную переменную, которую устанавливает процедура.
Код: plsql
1.
if (rdb$get_context('USER_TRANSACTION', 'MAINTANCE_MODE') is not null) then exit;


Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны.
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970768
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
Права объектов не передаются другим объектам при выполнении.

А в чём логика такого решения?
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970776
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

потому что стандарт описывает два способа передачи прав при выполнении процедурного кода SQL SECURITY {INVOKER | DEFINER}. Вторая - выполнении с правами владельца - реализована в Firebird 4.0.

Исторически в Firebird и Interbase процедурный код выполняется с правами вызывающего пользователя (SQL SECURITY INVOKER). Но у нас реализовано мощное расширение - возможность давать права для процедур, триггеров и функций на другие объекты базы данных.

В 4.0 можно написать процедуру, триггер или функцию с SQL SECURITY DEFINER и в большинстве случаев забить на раздачу ей специальных прав.
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970777
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
hvlad
Права объектов не передаются другим объектам при выполнении.

А в чём логика такого решения?
Вопрос к тем, кто это проектировал ещё в IB.

Я думаю, что она может быть в

-отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали,
- отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть.
По цепочке из десятков вызовов - пойди найди откуда оно появилось.
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970780
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
В триггере стоит проверка на контекстную переменную, которую устанавливает процедура.
Код: plsql
1.
if (rdb$get_context('USER_TRANSACTION', 'MAINTANCE_MODE') is not null) then exit;



Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны.
Права проверяются при подготовке запроса, проверка производится для всех действий над всеми объектами, для всего дерева выполнения запроса, независимо от ветвлений в коде.
Чти стандарт.
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970782
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
-отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали,
- отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть.
По цепочке из десятков вызовов - пойди найди откуда оно появилось.

Понятно. Просто с какой-то стороны - это понижение безопасности.
Ну вот например: у меня сервисная процедура, которая делает какие-то действия. Я хотел дать ей минимум прав, только на те таблицы, которые она затрагивает, а пользователю - вообще только на её вызов и всё. А теперь мне надо давать либо пользователю права на изменение других таблиц, либо следить за правами триггеров этих таблиц. А в идеале ИМХО все права должны были быть у процедуры, чтобы если где-то что-то пойдёт не так - у неё просто не было бы шансов изменить данные, менять которые она не должна...
...
Рейтинг: 0 / 0
Процедуры, триггеры и права...
    #39970786
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Понятно. Просто с какой-то стороны - это понижение безопасности.
Да ну ?

alekcvp
Ну вот например: у меня сервисная процедура, которая делает какие-то действия. Я хотел дать ей минимум прав, только на те таблицы, которые она затрагивает, а пользователю - вообще только на её вызов и всё
Всё правильно.

alekcvp
А теперь мне надо давать либо пользователю права на изменение других таблиц, либо следить за правами триггеров этих таблиц
Тоже правильно.

Где понижение безопасности ?

alekcvp
А в идеале ИМХО все права должны были быть у процедуры, чтобы если где-то что-то пойдёт не так - у неё просто не было бы шансов изменить данные, менять которые она не должна...
А потом появляется новая таблица и старый триггер на другую старую таблицу начинает что-то с ней делать.
И ты начинаешь судорожно искать все процедуры, которые могут вызвать этот старый триггер и добавляешь им права на новую таблицу.
Нравится ?

Или можно дать старому триггеру доп права на действия с новой таблицей.

Каждому - своё, сложные зависимости - зло.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Процедуры, триггеры и права...
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]