es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Oracle – el procedimiento con AUTHID CURRENT_USER arroja ORA-00942: la tabla o vista no existe

¿Sabes por qué el procedimiento con AUTHID CURRENT_USER arroja ORA-00942: la tabla o vista no existe incluso después de otorgar todos los privilegios necesarios al invocador?

Creé un procedimiento proc1 bajo el usuario1 para insertar en la tabla logs. El propietario de la tabla logs es user1.

Luego otorgué permisos al usuario2.

grant execute on proc1 to user2;
grant insert on logs to user2;

Cuando ejecuto proc1 desde user2, arroja ORA-00942: la tabla o vista no existe.

Por favor, ¿alguien sabe la razón?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que el procedimiento con AUTHID CURRENT_USER arroja el error ORA-00942 incluso después de otorgar todos los privilegios necesarios al invocador es porque el invocador (en este caso, el usuario2) no tiene el privilegio SELECT en la tabla de registros. Cuando se crea un procedimiento con AUTHID CURRENT_USER, se ejecuta con los privilegios del invocador y no del propietario del procedimiento. Esto significa que el invocador debe tener todos los privilegios necesarios, incluido el privilegio SELECT en la tabla de registros, para que el procedimiento se ejecute correctamente.

    Para solucionar este problema, puedes otorgar el privilegio SELECT en la tabla de registros al usuario2:

    GRANT SELECT ON logs TO user2;
    

    Alternativamente, puedes modificar el procedimiento para usar AUTHID DEFINER en lugar de AUTHID CURRENT_USER. Esto hará que el procedimiento se ejecute con los privilegios del propietario (usuario1) y no del invocador, por lo que el invocador no necesita el privilegio SELECT en la tabla de registros.

    CREATE OR REPLACE PROCEDURE proc1 AUTHID DEFINER
    IS
    BEGIN
       INSERT INTO logs (column1, column2) VALUES ('valor1', 'valor2');
       COMMIT;
    END;
    

    Nota que si decides modificar el procedimiento para usar AUTHID DEFINER, es posible que también necesites modificar otras partes de tu código que dependan del comportamiento anterior del procedimiento al ejecutarse con los privilegios del invocador.

Comments are closed.