Pregunta

Cuando intento ejecutar una vista que incluye tablas de diferentes esquemas, se arroja un ORA-001031 Privilegios insuficientes. Estas tablas tienen permiso de ejecución para el esquema donde se creó la vista. Si ejecuto la instrucción SQL de la vista, funciona. ¿Qué me estoy perdiendo?

¿Fue útil?

Solución

Como propietario de la tabla, debe otorgar acceso SELECT en las tablas subyacentes al usuario al que está ejecutando la instrucción SELECT como.

grant SELECT on TABLE_NAME to READ_USERNAME;

Otros consejos

Finalmente lo puse a trabajar. La respuesta de Steve es correcta, pero no para todos los casos. Falla cuando esa vista se ejecuta desde un tercer esquema. Para que eso funcione, debe agregar la opción de subvención:

GRANT SELECT ON [TABLE_NAME] TO [READ_USERNAME] WITH GRANT OPTION;

De esa manera, [READ_USERNAME] también puede otorgar privilegios de selección sobre la vista a otro esquema

P. ¿Cuándo es el " con opción de concesión " requerido?

A. cuando tiene una vista ejecutada desde un tercer esquema.

Ejemplo:     El esquema DSDSW tiene una vista llamada view_name

a) that view selects from a table in another schema  (FDR.balance)
b) a third shema  X_WORK  tries to select  from that view

Subvenciones típicas:     conceda select en dsdw.view_name a dsdw_select_role;     conceda dsdw_select_role a fdr;

Pero: fdr consigue     seleccione count (*) de dsdw.view_name;      ERROR en la línea 1:      ORA-01031: privilegios insuficientes

emitir la subvención:

grant select on fdr.balance to dsdw with grant option;

ahora fdr:     seleccione count (*) de dsdw.view_name;          5 filas

Déjame hacer un resumen.

Cuando crea una vista que contiene objetos de diferentes propietarios, esos otros propietarios tienen que otorgar " con la opción de concesión " al dueño de la vista. Por lo tanto, el propietario de la vista puede otorgar a otros usuarios o esquemas ...

Ejemplo: User_a es el propietario de una tabla llamada mine_a User_b es el propietario de una tabla llamada yours_b

Digamos que user_b quiere crear una vista con una combinación de mine_a y yours_b

Para que la vista funcione bien, user_a tiene que dar " grant select en mine_a a user_b con la opción de concesión "

Entonces user_b puede otorgar select en esa vista a todos.

Si se accede a la vista mediante un procedimiento almacenado, la concesión de ejecución es insuficiente para acceder a la vista. Debe otorgar select explícitamente.

Si se accede a la vista mediante un procedimiento almacenado, la concesión de ejecución es insuficiente para acceder a la vista. Debe otorgar select explícitamente.

simplemente escriba esto

conceder todo al público;

Para usar una vista, el usuario debe tener los privilegios apropiados, pero solo para la vista en sí, no para sus objetos subyacentes. Sin embargo, si se eliminan los privilegios de acceso para los objetos subyacentes de la vista, el usuario ya no tiene acceso. Este comportamiento se debe a que el dominio de seguridad que se utiliza cuando un usuario consulta la vista es el que define la vista. Si los privilegios sobre los objetos subyacentes se revocan desde el definidor de la vista, entonces la vista se invalida y nadie puede usar la vista. Por lo tanto, incluso si a un usuario se le ha otorgado acceso a la vista, es posible que el usuario no pueda usar la vista si los derechos del definidor han sido revocados de los objetos subyacentes de la vista.

Documentación de Oracle http://docs.oracle.com/cd/B28359_01 /network.111/b28531/authorization.htm#DBSEG98017

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top