GRANT TRUNCATE TABLE en Oracle Database

Si estás leyendo esto probablemente necesites otorgar permisos para truncar las tablas (lo que sería GRANT TRUCANTE TABLE o GRANT TRUCATE ANY TABLE) de un usuario en concreto de la base de datos Oracle. Voy a ser directo en este sentido y te voy a decir desde ya que el permiso de TRUNCATE no existe, así que no podrás asignarlo.

La única opción que tenemos como DBA es dar permisos para eliminar cualquier tabla a un usuario, lo que vendría a ser:

GRANT DROP ANY TABLE TO <NOMBRE_USUARIO>;

De esta forma podríamos truncar una tabla de otro esquema/usuario. Esto tiene un gran problema, y es la seguridad. Otorgar privilegios a un usuario para eliminar cualquier tabla de la base de datos es un ejercicio de fe bastante complejo, que en la mayoría de casos no deberíamos permitir. Por suerte aquí somos ninjas de Oracle, así que vamos a ver qué podemos hacer para solventar la situación.

Otorgar GRANT TRUNCATE TABLE por método alternativo

Ya que el permiso no existe, vamos a solucionarlo de otra manera. Quizás alguno ya lo haya adivinado, pero la solución más eficiente para esta situación es crear un procedimiento (procedure) en el esquema/usuario en cuestión donde queremos truncar las tablas.

create or replace procedure TRUNCAR_TABLA(nombre_tabla in varchar2 )
as
begin
 execute immediate 'TRUNCATE TABLE ' || nombre_tabla ;
end; 
/

Después de esto tendremos que crear un sinónimo del procedimiento para el usuario que necesite privilegios al/los usuario/s que necesiten truncar tablas y darle permisos de ejecución:

create synonym <NOMBRE_USUARIO>.TRUNCAR_TABLA for TRUNCAR_TABLA;
grant execute on TRUNCAR_TABLA to <NOMBRE_USUARIO>;

Siempre y cuando el usuario en cuestión tenga sinónimos de la tabla, ejecutando el procedimiento podrá truncar la tabla.

execute TRUNCAR_TABLA( '<NOMBRE_TABLA>' );

Ejemplo práctico

Supongamos que tenemos un usuario de base de datos llamado USUARIO1 que contiene la tabla PRUEBA_NINJA. Por otro lado tenemos al USUARIO2 que necesita truncar esa tabla. Bajo esta premisa tendríamos que realizar los siguientes pasos:

1. Crear el procedimiento TRUNCAR_TABLA en el USUARIO1:

create or replace procedure TRUNCAR_TABLA(nombre_tabla in varchar2 )
as
begin
 execute immediate 'TRUNCATE TABLE ' || nombre_tabla ;
end; 
/

2. Crear los sinónimos del procedimiento del procedimiento en USUARIO2 y darle permisos de ejecución (esto lo podemos hacer como sys/system):

create synonym USUARIO2.TRUNCAR_TABLA for TRUNCAR_TABLA;
grant execute on TRUNCAR_TABLA to USUARIO2;

3. Ejecutar el procedimiento desde USUARIO2:

execute TRUNCAR_TABLA( 'PRUEBA_NINJA' );

Y vualá, con esto ya deberíamos ser capaces de truncar tablas desde otros usuarios, aún sin haber otorgado los permisos GRANT TRUNCATE TABLE, que como decía en la introducción y como ya sabéis, no existen. Espero que os haya servido!

Deja un comentario