j'ai eu une demande pour mettre en œuvre des privilèges au niveau de la colonne, par exemple:privilèges au niveau des colonnes par rapport aux applications héritées
GRANT UPDATE("column1") ON "TABLE" TO ROLE;
Mais je trouve que les applications clientes (en Delphi + ODAC) émet toujours des mises à jour SQL comme:
update TABLE set column1=:column1,column2=:column2,column3=:column3,...etc
where id_c=:id_c;
ce qui provoque Oracle à toujours lancer ORA-01031: privilèges insuffisants, même si ce ne colonne1 a été changé. La solution évidente est de changer l'application cliente pour qu'elle n'émette des mises à jour SQL qu'avec des colonnes modifiées, mais cela ressemble à beaucoup de code.
Y a-t-il une solution plus élégante possible? Editer: J'ai oublié de mentionner qu'il y a un nombre considérable de requêtes d'insertion/mise à jour codées en dur dans mes sources Delphi. L'ODAC ne peut pas aider dans ce cas.
Merci! Mais ce n'est pas bien entretenu. Que se passe-t-il si le client décide plus tard qu'il veut un nouveau rôle qui inclura column2, par exemple? Et puis un autre? Devrai-je mettre à jour le code à chaque fois? – Juraj
@Juraj, vous avez manqué le point de Quassnoi. Sa vue sélectionne * (toutes les colonnes) de la table. Le déclencheur ne met à jour que les colonnes qui ont réellement changé (bien qu'une colonne à la fois, ce qui est très inefficace, mais le seul moyen pratique de résoudre votre problème). Vous avez seulement besoin de mettre à jour le code si la * structure * de la table sous-jacente change, pas si vous changez juste des attributions de rôle. –
Bien sûr, si l'utilisateur A n'a pas de privilège de mise à jour sur une colonne, mais qu'il essaie de le changer de toute façon, il aura toujours l'ORA-01031 - ce qui est une bonne chose. –