El grant de TRUNCATE no existe. La opción como DBA es dar el rol de sistema DROP ANY TABLE, que no es muy recomendable.
La solución sería crear un procedimiento almacenado en el propietario de las tablas y darle el GRANT EXECUTE al usuario sobre ese procedimiento almacenado. Como el procedimiento almacenado se ejecuta con las credenciales del propietario, haría el TRUNCATE sin ningún problema
CREATE OR REPLACE PROCEDURE TRUNCA_TABLA(TABLA IN VARCHAR2)
AS
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || TABLA;
END;
Posterior, entonces otorgaremos los permisos al usuario
GRANT EXECUTE ON "HR"."TRUNCA_TABLA" TO SOYUNDBA;
La forma de ejecutar el truncare, en este caso desde el usuario SOYUNDBA es:
EXECUTE HR.TRUNCA_TABLA('DATOS');
Finalmente, al momento de realizar la validación de la data, evidenciamos que la tabla ya no cuenta con ningún registro .
Por otro lado tambien puede ser útil crear un sinónimo con el fin de no tener que realizar el llamado al esquema para poder utilizar el procedimiento.
CREATE SYNONYM SOYUNDBA.TRUNCA_TABLA FOR HR.TRUNCA_TABLA;
GRANT EXECUTE ON HR.TRUNCA_TABLA TO SOYUNDBA;
De esta manera, para realizar el llamado seria de la siguiente forma:
EXECUTE TRUNCA_TABLA('DATOS');
Te invito a seguir consultando más articulos relacionados a Oracle dando clic aquí.