|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
Имеется таблица, которая при вставке данных триггером обновляет другую таблицу. Имеется процедура, которая вставляет данные в первую таблицу. Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает. Теперь я вызываю процедуру через аккаунт, у которого нет прав на обновление второй таблицы и получаю ошибку, что у него нет прав на обновление второй таблицы, причём в 0й строке процедуры, когда она ещё даже не начала выполняться. И самое вкусное: если я процедуре даю права на обновление второй таблицы, то она всё равно не выполняется, потому что нет прав на обновление второй таблицы... Вопрос: это баг или фича и как это можно обойти? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 19:50 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
Впрочем, как обойти я придумал, вопрос почему права процедуры игнорируются... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 20:03 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvpвопрос почему права процедуры игнорируются... Потому что ты не перезагрузил кэш метаданных, наверное. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 20:10 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp, вторую таблицу обновляет триггер первой таблицы, так ? При чём тут права процедуры ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.06.2020, 21:57 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
hvlad alekcvp, вторую таблицу обновляет триггер первой таблицы, так ? При чём тут права процедуры ? 1. Если я даю права триггеру - всё работает (логично). 2. Если я даю права процедуре - не работает. 3. Если я даю права пользователю, который выполняет процедуру - внезапно всё снова работает. В чём принципиальное различие 2. и 3.?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 00:21 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp, пользователь->процедура->таблица1->триггер->таблица2 права не наследуются по цепочке. если дать права процедуре на таблицу1, то у триггера таблицы1 нет прав обновлять таблицу2 если дать права пользователю (какие именно права?) на процедуру, то дальше процедуры тоже не пойдет. таким образом, 1. можно дать юзеру права на всё - процедуру, таблицу1 и таблицу2, тогда всё работает. 2. нужно давать права: пользователю на процедуру, процедуре на таблицу1, триггеру на таблицу2. p.s. конечно, раньше были какие-то косяки с правами, может что-то где-то затерялось. Но я бы все права почистил, и повторил эксперимент почетче. А то что в первом, что в последнем сообщении не уточняется, кому именно какие права даются. p.p.s. насчет вашего пункта 3 - а как же "Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает." ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 01:21 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp В чём принципиальное различие 2. и 3.?.. Права объектов не передаются другим объектам при выполнении. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 01:36 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
kdv p.p.s. насчет вашего пункта 3 - а как же "Триггер, в первой таблице, написан так что если вставка данных идёт из процедуры, то он ничего не делает." Вот и мне интересно - а как же? В триггере стоит проверка на контекстную переменную, которую устанавливает процедура. Код: plsql 1.
Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:29 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
hvlad Права объектов не передаются другим объектам при выполнении. А в чём логика такого решения? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:29 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp, потому что стандарт описывает два способа передачи прав при выполнении процедурного кода SQL SECURITY {INVOKER | DEFINER}. Вторая - выполнении с правами владельца - реализована в Firebird 4.0. Исторически в Firebird и Interbase процедурный код выполняется с правами вызывающего пользователя (SQL SECURITY INVOKER). Но у нас реализовано мощное расширение - возможность давать права для процедур, триггеров и функций на другие объекты базы данных. В 4.0 можно написать процедуру, триггер или функцию с SQL SECURITY DEFINER и в большинстве случаев забить на раздачу ей специальных прав. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:40 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp hvlad Права объектов не передаются другим объектам при выполнении. А в чём логика такого решения? Я думаю, что она может быть в -отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали, - отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть. По цепочке из десятков вызовов - пойди найди откуда оно появилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:43 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp В триггере стоит проверка на контекстную переменную, которую устанавливает процедура. Код: plsql 1.
Но при этом при запуске процедуры FB проверяет пользователя на наличии всех прав по цепочке, которые только могут быть затронуты в теории (даже триггерами других таблиц, которые срабатывали бы по цепочке, если бы выполнился первый триггер). И если хоть одного права нет - он даже не начинает выполнять процедуру, хотя по-факту они нафиг не нужны. Чти стандарт. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:45 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
hvlad -отсутствии "сюрпризов", когда один и тот же объект получает разные права в зависимости от того, как его вызвали, - отсутствии сложно определяемых нарушений безопасности, когда объект вдруг получает права, которых у него не должно быть. По цепочке из десятков вызовов - пойди найди откуда оно появилось. Понятно. Просто с какой-то стороны - это понижение безопасности. Ну вот например: у меня сервисная процедура, которая делает какие-то действия. Я хотел дать ей минимум прав, только на те таблицы, которые она затрагивает, а пользователю - вообще только на её вызов и всё. А теперь мне надо давать либо пользователю права на изменение других таблиц, либо следить за правами триггеров этих таблиц. А в идеале ИМХО все права должны были быть у процедуры, чтобы если где-то что-то пойдёт не так - у неё просто не было бы шансов изменить данные, менять которые она не должна... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:49 |
|
Процедуры, триггеры и права...
|
|||
---|---|---|---|
#18+
alekcvp Понятно. Просто с какой-то стороны - это понижение безопасности. alekcvp Ну вот например: у меня сервисная процедура, которая делает какие-то действия. Я хотел дать ей минимум прав, только на те таблицы, которые она затрагивает, а пользователю - вообще только на её вызов и всё alekcvp А теперь мне надо давать либо пользователю права на изменение других таблиц, либо следить за правами триггеров этих таблиц Где понижение безопасности ? alekcvp А в идеале ИМХО все права должны были быть у процедуры, чтобы если где-то что-то пойдёт не так - у неё просто не было бы шансов изменить данные, менять которые она не должна... И ты начинаешь судорожно искать все процедуры, которые могут вызвать этот старый триггер и добавляешь им права на новую таблицу. Нравится ? Или можно дать старому триггеру доп права на действия с новой таблицей. Каждому - своё, сложные зависимости - зло. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.06.2020, 10:56 |
|
|
start [/forum/topic.php?fid=40&msg=39970767&tid=1560323]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 163ms |
0 / 0 |