TRUNCATE, sécurité

La permission de tronquer

      TRUNCATE est une commande puissante. Un utilisateur (ou rôle avec PostgreSQL) a la possibilité de tronquer une table lui appartenant. Mais comment octroyer ce privilège si nous souhaitons dissocier les utilisateurs propriétaires des tables des utilisateurs manipulant les données ?
      Tout d’abord un premier test avec PostgreSQL 9.6 :

SELECT version(); version ------------------------------------------------------------------------------------------ PostgreSQL 9.6.0 on x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit (1 ligne) -- connecté phil, utilisateur propriétaire de t1 GRANT TRUNCATE ON t1 TO phills; GRANT -- connecté phills TRUNCATE TABLE phil.t1; TRUNCATE TABLE

      Avec PostgreSQL le propriétaire de la table peut simplement donner le privilège de tronquer sa table à un autre rôle (utilisateur).
      A présent un test avec Oracle Database dans sa version 12.1 :

Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options -- connecté phil, utilisateur propriétaire de t1 SQL> GRANT TRUNCATE ON t1 TO phills; GRANT TRUNCATE ON t1 TO phills; * ERROR at line 1: ORA-00990: missing or invalid privilege SQL> GRANT DELETE ON t1 TO phills; Grant succeeded. -- connecté phills TRUNCATE TABLE phil.t1; TRUNCATE TABLE phil.t1 * ERROR at line 1: ORA-01031: insufficient privileges -- connecté system, utilisateur dba GRANT drop any table TO phills; -- connecté phills SQL> TRUNCATE TABLE phil.t1; Table truncated.

      Oracle ne dispose pas de privilège dédié pour autoriser un utilisateur ou rôle à réaliser un TRUNCATE sur une table ne lui appartenant pas. Oracle utilise la notion de privilège système et il faut disposer du privilège DROP ANY TABLE pour réaliser un TRUNCATE sur une table dont on n’est pas propriétaire. Accorder ce privilège est cependant dangereux car l’utilisateur disposant de DROP ANY TABLE pourra réaliser un TRUNCATE sur la table considérée...mais il pourra aussi tronquer ou supprimer n’importe quelle autre table ! Tom Kyte recommande d’utiliser une procédure PL/SQL pour contourner ce problème mais devoir utiliser une procédure pour un besoin couvert par SQL est toujours regrettable.

Mise à jour : 20/10/2016