я получил запрос для реализации права на уровне столбцов, например:привилегии на уровне столбцов против унаследованного приложения
GRANT UPDATE("column1") ON "TABLE" TO ROLE;
Но я обнаружил, что клиентские приложения (в Delphi + ODAC) всегда выдает обновления SQL, как:
update TABLE set column1=:column1,column2=:column2,column3=:column3,...etc
where id_c=:id_c;
что заставляет Oracle всегда бросить ORA-01031: недостаточно привилегий, даже если только column1 был изменен. Очевидным решением является изменение клиентского приложения, так что он испускает обновления SQL только с измененными столбцами, но это выглядит довольно много кода.
Возможно ли более элегантное решение?
Редактирование: Я забыл упомянуть, что в моих источниках Delphi имеется значительное количество запросов вставки/обновления жесткого кодирования. ODAC не может помочь в этом случае.
Спасибо! Но это не очень удобно. Что, если позже клиент решает, хочет ли он новую роль, которая будет включать, например, колонку2? А потом еще один? Должен ли я обновлять код каждый раз? – Juraj
@ Юрай, вы пропустили точку в Квасной. Его представление выбирает * (все столбцы) из таблицы. Триггер обновляет только те столбцы, которые фактически изменились (хотя и один столбец за раз, что очень неэффективно, но единственный практический способ решить вашу проблему). Вам нужно обновить код только в том случае, если * структура * базовой таблицы изменится, а не если вы просто измените некоторые гранты. –
Конечно, если пользователь A не имеет привилегий обновления в столбце, но все равно пытается его изменить, они все равно получат ORA-01031 - это хорошо. –