23/8/10

ORA-01720

En la concesión de privilegios (GRANT) a vistas (VIEW) en Oracle se puede producir un error inexperado (ORA-01720) cuando se otorgan privilegios a un usuario sobre una vista que hace referencia a objetos que pertenecen a otro usuario.

Ejemplo

Veamos un ejemplo. Empezamos con un usuario y una tabla simple:

usuario1@TEST10G> SELECT * FROM PRUEBA01;

        ID TXT
---------- -------------------------
         1 UNO
         2 DOS
         3 TRES
         4 CUATRO
         5 CINCO
         6 SEIS

6 filas seleccionadas.

usuario1@TEST10G> GRANT SELECT ON PRUEBA01 TO usuario2;

Concesión terminada correctamente.

usuario1@TEST10G> GRANT SELECT ON PRUEBA01 TO usuario3;

Concesión terminada correctamente.
Comprobamos que los usuarios 2 y 3 pueden acceder a la tabla.
El usuario2:

usuario2@TEST10G> SELECT * FROM usuario1.PRUEBA01;

        ID TXT
---------- -------------------------
         1 UNO
         2 DOS
         3 TRES
         4 CUATRO
         5 CINCO
         6 SEIS

6 filas seleccionadas.
y el usuario3:
usuario3@TEST10G> SELECT * FROM usuario1.PRUEBA01;

        ID TXT
---------- -------------------------
         1 UNO
         2 DOS
         3 TRES
         4 CUATRO
         5 CINCO
         6 SEIS

6 filas seleccionadas.
Hasta aquí, todo correcto. El asunto se complica cuando el usuario2 crea una vista e intenta darle privilegios de lectura al usuario3:

usuario2@TEST10G> CREATE VIEW PRUEBAVW AS SELECT * FROM PRUEBA01;

Vista creada.

usuario2@TEST10G> GRANT SELECT ON PRUEBAVW TO usuario3;
GRANT SELECT ON PRUEBAVW TO usuario3
                *
ERROR en línea 1:
ORA-01720: la opción Otorgar no existe para 'USUARIO1.PRUEBA01'
Por alguna razón, el usuario2 no puede otorgar los privilegios sobre la vista al usuario3. (Recordemos que usuario3 tiene privilegios sobre la tabla base de la vista usuario1.PRUEBA01)
Ni siquiera SYSTEM puede:
system@TEST10G> GRANT SELECT ON usuario2.PRUEBAVW TO usuario3;
GRANT SELECT ON USUARIO2.PRUEBAVW TO USUARIO3
                *
ERROR en línea 1:
ORA-01720: la opción Otorgar no existe para 'USUARIO1.PRUEBA01'
El problema está en que Oracle no verifica los GRANTS sobre los objetos base de las vistas, sino que los debe conceder explícitamente para la ejecución de la vista. Y esto sólo se puede hacer otorgando los privilegios sobre los objetos base de la vista al propietario de la misma con la opción WITH GRANT OPTION.
Lo vemos a continuación:
usuario1@TEST10G> GRANT SELECT ON PRUEBA01 TO usuario2 WITH GRANT OPTION;

Concesión terminada correctamente.
Y ahora ya podemos dar premisos de SELECT a otros usuarios:
usuario2@TEST10G> GRANT SELECT ON PRUEBAVW TO usuario3;

Concesión terminada correctamente.

usuario2@TEST10G>
Concedido el permiso se verifica que se pueda listar:

usuario3@TEST10G> select * from usuario2.pruebavw;

        ID TXT
---------- -------------------------
         1 UNO
         2 DOS
         3 TRES
         4 CUATRO
         5 CINCO
         6 SEIS

6 filas seleccionadas.
Pero la cosa se vuelve más peliaguda si hacemos:
usuario1@TEST10G> revoke SELECT ON PRUEBA01 from usuario2;

Revocación terminada correctamente.
usuario1@TEST10G> GRANT SELECT ON PRUEBA01 TO usuario2;

Concesión terminada correctamente.
Porque ahora el pobre usuario3, sin saber porqué, verá:
usuario3@TEST10G> select * from usuario2.pruebavw;
select * from usuario2.pruebavw
*
ERROR en línea 1:
ORA-01031: privilegios insuficientes

usuario3@TEST10G>
Así que hay que tener mucho cuidado cuando se otorgan privilegios sobre vistas si éstas hacen referencia a objetos base que pertenecen a otros esquemas. Y también si se revocan y vuelven a conceder los privilegios sobre los objetos base sin hacer caso al WITH GRANT OPTION.

Fuente original
Otro artículo

3 comentarios:

  1. copy & paste de http://carlosal.wordpress.com/2007/02/12/grants-ora-01720-y-views/

    ResponderEliminar
  2. Joé...

    Me lo has 'fusilao'.

    Saludos.

    Carlos.

    ResponderEliminar
  3. Citado estás....
    Si te ocasiona algún inconveniente lo retiro.

    ResponderEliminar