Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
 Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
Имеется таблица, которая при вставке данных триггером обновляет другую таблицу.
Имеется процедура, которая вставляет данные в первую таблицу.
Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает.

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

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

Вопрос: это баг или фича и как это можно обойти?

Сообщение было отредактировано: 18 июн 20, 19:49
18 июн 20, 19:50    [22153199]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
Впрочем, как обойти я придумал, вопрос почему права процедуры игнорируются...
18 июн 20, 20:03    [22153206]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50344

alekcvp
вопрос почему права процедуры игнорируются...

Потому что ты не перезагрузил кэш метаданных, наверное.

Posted via ActualForum NNTP Server 1.5

18 июн 20, 20:10    [22153212]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
hvlad
Member

Откуда:
Сообщений: 10955
alekcvp,

вторую таблицу обновляет триггер первой таблицы, так ?
При чём тут права процедуры ?
18 июн 20, 21:57    [22153258]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
hvlad
alekcvp,

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


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

В чём принципиальное различие 2. и 3.?..
19 июн 20, 00:21    [22153313]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28878
alekcvp,

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

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

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

p.p.s. насчет вашего пункта 3 - а как же
"Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает."
19 июн 20, 01:21    [22153319]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
hvlad
Member

Откуда:
Сообщений: 10955
alekcvp
В чём принципиальное различие 2. и 3.?..
Проверяются права пользователя и права того объекта, который выполняет операцию.
Права объектов не передаются другим объектам при выполнении.
19 июн 20, 01:36    [22153321]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
kdv
p.p.s. насчет вашего пункта 3 - а как же
"Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает."

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

Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны.
19 июн 20, 10:29    [22153445]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
hvlad
Права объектов не передаются другим объектам при выполнении.

А в чём логика такого решения?
19 июн 20, 10:29    [22153448]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10574
alekcvp,

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

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

В 4.0 можно написать процедуру, триггер или функцию с SQL SECURITY DEFINER и в большинстве случаев забить на раздачу ей специальных прав.
19 июн 20, 10:40    [22153461]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
hvlad
Member

Откуда:
Сообщений: 10955
alekcvp
hvlad
Права объектов не передаются другим объектам при выполнении.

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

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

-отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали,
- отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть.
По цепочке из десятков вызовов - пойди найди откуда оно появилось.
19 июн 20, 10:43    [22153463]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
hvlad
Member

Откуда:
Сообщений: 10955
alekcvp
В триггере стоит проверка на контекстную переменную, которую устанавливает процедура.
if (rdb$get_context('USER_TRANSACTION', 'MAINTANCE_MODE') is not null) then exit;


Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны.
Права проверяются при подготовке запроса, проверка производится для всех действий над всеми объектами, для всего дерева выполнения запроса, независимо от ветвлений в коде.
Чти стандарт.
19 июн 20, 10:45    [22153467]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
alekcvp
Member

Откуда:
Сообщений: 2177
hvlad
-отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали,
- отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть.
По цепочке из десятков вызовов - пойди найди откуда оно появилось.

Понятно. Просто с какой-то стороны - это понижение безопасности.
Ну вот например: у меня сервисная процедура, которая делает какие-то действия. Я хотел дать ей минимум прав, только на те таблицы, которые она затрагивает, а пользователю - вообще только на её вызов и всё. А теперь мне надо давать либо пользователю права на изменение других таблиц, либо следить за правами триггеров этих таблиц. А в идеале ИМХО все права должны были быть у процедуры, чтобы если где-то что-то пойдёт не так - у неё просто не было бы шансов изменить данные, менять которые она не должна...
19 июн 20, 10:49    [22153471]     Ответить | Цитировать Сообщить модератору
 Re: Процедуры, триггеры и права...  [new]
hvlad
Member

Откуда:
Сообщений: 10955
alekcvp
Понятно. Просто с какой-то стороны - это понижение безопасности.
Да ну ?

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

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

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

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

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

Каждому - своё, сложные зависимости - зло.
19 июн 20, 10:56    [22153480]     Ответить | Цитировать Сообщить модератору
Все форумы / Firebird, InterBase Ответить