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.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.
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:usuario2@TEST10G> SELECT * FROM usuario1.PRUEBA01;
ID TXT
---------- -------------------------
1 UNO
2 DOS
3 TRES
4 CUATRO
5 CINCO
6 SEIS
6 filas seleccionadas.
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:ID TXT
---------- -------------------------
1 UNO
2 DOS
3 TRES
4 CUATRO
5 CINCO
6 SEIS
6 filas seleccionadas.
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'
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.GRANT SELECT ON USUARIO2.PRUEBAVW TO USUARIO3
*
ERROR en línea 1:
ORA-01720: la opción Otorgar no existe para 'USUARIO1.PRUEBA01'
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:Concesión terminada correctamente.
usuario2@TEST10G> GRANT SELECT ON PRUEBAVW TO usuario3;
Concesión terminada correctamente.
usuario2@TEST10G>
Concedido el permiso se verifica que se pueda listar:Concesión terminada correctamente.
usuario2@TEST10G>
usuario3@TEST10G> select * from usuario2.pruebavw;
ID TXT
---------- -------------------------
1 UNO
2 DOS
3 TRES
4 CUATRO
5 CINCO
6 SEIS
6 filas seleccionadas.
usuario1@TEST10G> revoke SELECT ON PRUEBA01 from usuario2;
Revocación terminada correctamente.
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á:Concesión terminada correctamente.
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.select * from usuario2.pruebavw
*
ERROR en línea 1:
ORA-01031: privilegios insuficientes
usuario3@TEST10G>
Fuente original
Otro artículo
copy & paste de http://carlosal.wordpress.com/2007/02/12/grants-ora-01720-y-views/
ResponderEliminarJoé...
ResponderEliminarMe lo has 'fusilao'.
Saludos.
Carlos.
Citado estás....
ResponderEliminarSi te ocasiona algún inconveniente lo retiro.