Cuestiones sobre concesión de permisos y seguridad en Oracle

44 replies [Último envío]
Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Abro este tema a propósito del artículo Grants with grant option, la propiedad transitiva en la concesión de permisos para comentar cualquier cuestión sobre el mismo, o temas relacionados con la seguridad, los roles y la concesión de permisos en Oracle.

wilber (no verificado)

q pasa si qiero dar los rpivilegios pero no solo a una tabla si no a todas a la ves

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Para conceder permisos sobre todas las tablas de un usuario a otro usuario se puede utilizar la sentencia:

grant SELECT_ANY_TABLE to ;

Carlos Fernández

Analista de sistemas

Anonimo (no verificado)

Hola, necesito crear una tabla en una session, donde esta tabla hace referencias a otras tablas que estan en otra session, me tira un error: previlegios insuficientes

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Seguramente es porque el usuario User1 que quiere crear la tabla TabA no tiene permisos asignados sobre la tabla TabB del otro esquema User2 a la que se hace referencia.

Para solucionarlo deberías conectarte con el User2 o un usuario de sistema y asignar los permisos necesarios al User1:

GRANT SELECT ON User2.TabA TO User1;

Carlos Fernández

Analista de sistemas

Frank (no verificado)

Buenos Dias.
Soy nuevo en oracle y estube creando algunos roles especificamente para la creacion de objetos tales como tablas vista, secuencias entre otros mas y no consigo cual es el privilegio para crear  los COMMENT en las tablas. agradeseria su maximo apoyo en esto.

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Hola Frank

Si el usuario que utilizas es el propietario de las tablas no necesita ningún privilegio especial para crear comentarios en ellas.
Si, por ejemplo, el usuario miusuario ha creado la tabla mitabla podrás ejecutar sin problemas la sentencia:

COMMENT ON COLUMN mitabla.nombre IS 'mi comentario sobre el campo nombre';

Si el usuario que utilizas no es el owner de la tabla o vista que quieres comentar necesitará tener el privilegio COMMENT ANY TABLE y si se tratara de comentar en un índice necesitaría el COMMENT ANY INDEXTYPE.

Para concedérselo, con un usuario con privilegios de DBA (System, por ejemplo) ejecuta la sentencia:

GRANT COMMENT ANY TABLE TO miusuario;

Frank (no verificado)

Amigo Muchas Gracias por tu respuesta, me sirvio de gran ayuda...

Jose Antonio (no verificado)

Gracias por el comentario.

 

Quisiera añadir que para que que 'U_CONSULTA' pueda trabajar sobre la VISTA sin que la base de datos le devuelva un ORA-00942, este procedimiento también daría resultado: 

   U_DATOS:
   SQL> GRANT SELECT ON TABLA TO U_VISTA WITH GRANT OPTION;

   U_VISTA:
   SQL> GRANT SELECT ON VISTA TO U_CONSULTA;

   U_CONSULTA:
   SQL> SELECT * FROM VISTA;

 

Se elimina por tanto la sentencia de concesión de permisos de U_VISTA a U_CONSULTA sobre el objeto U_DATOS.TABLA:

--   U_VISTA:
--   SQL> GRANT SELECT ON U_DATOS.TABLA TO U_CONSULTA;

 

Con este procedimiento, se restringe aún mas los permisos del usuario U_CONSULTA, ya que este sólo podría realizar una consulta a la vista VISTA y no a la tabla TABLA.
 

Jose (no verificado)

Buenas tardes,

 

En Oracle 10, desde el usuario "aplicacion1" ejecuto el comando  --> grant SELECT_ANY_TABLE to aplicacionadmin ;

Y me devuelve:

ORA-01919: el rol 'SELECT_ANY_TABLE' no existe

 

La idea es que desde aplicacionadmin se pueda realizar tareas de mantenimiento sobre todas las tablas de aplicacion1 y aplicacion2 asi como poder importar y exportar el esquema de cada uno de ellos teniendo su contenido en un tablespace en comun (TB_APLICACION)

 

¿Como puedo hacer esto?

 

Gracias

Ryusaki (no verificado)

Saludos!

 

como podria crear un usuario  y brindarle el privilegio de crear tablas e indices

dentro del usuario system a otro usuario dentro de su sesion?

y que el primer usuario creado al dar privilegios al usuario que creara lo haga con with grant option

por que me marca error que solo con admin option

gracias de antemano

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Jose, seguramente el problema es que el usuario 'aplicacion1' no tiene permisos de DBA.
Deberías hacer la concesión de permisos con el usuario SYS o SYSTEM, por ejemplo, o otorgar a 'aplicación1' privilegios para que a su vez pueda conceder permisos.

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Ryusaki, creo que me he perdido, tendrás que explicarte mejor.
A lo mejor lo que quieres hacer es más complicado, pero de momento asegúrate de que al crear el usuario le asignas estos roles para poder conectarse y crear objetos en su propio esquema:
GRANT "CONNECT" TO "APP";
GRANT "RESOURCE" TO "APP";

Ryusaki (no verificado)

 disculpa tienes razon tampoco me entendi muy bien,

pues en system debo crear a un usuario con privilegios restringidos

solo crear tablas, vistas e indices con la opcion with grant option, y dentro de ese usuario 

crear otro que tambien pueda crear vistas e indices,

pero me marca error que solo con with admin option o que no tengo suficientes

privilegios. 

gracias de antemano

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Creo que el problema que tenemos es de nomenclatura. No se puede crear un usuario dentro de otro usuario. A los usuarios se les asigna un tablespace por defecto, que es donde se crean todos sus objetos, si no se especifica lo contrario.

Por lo que dices yo entiendo que quieres crear un primer usuario que pueda crear objetos en el tablespace del usuario SYSTEM. Lo que ya no me queda tan claro es cómo quieres crear el segundo, a lo mejor te sirve simplemente crear otro que también pueda crear objetos en el mismo tablespace.

Comentarte también que no es muy habitual ni recomendable que un usuario cree objetos en el tablespace de SYSTEM, este espacio se suele reservar para objetos del sistema, a menos que esté muy justificado lo que quieres hacer, yo lo haría sobre otro tablespace.

Te recomiendo echarle un vistazo al post Cómo crear un nuevo esquema en Oracle paso a paso, y si sigues teniendo problemas, concretando ya con tablespaces y usuarios seguro que nos terminamos de aclarar.

Ryusaki (no verificado)

Saludos.

gracias de nuevo por tu respuesta.

y pues lo del usuario dentro de otro usuario es condicion para mi tarea, asi k no tengo opcion.

y lo peor de todo es que no puedo dar privilegios de system al primer usuario con with grant option

de crear tablas o vistas, y eso tambien es una condicion indispensable para entregar mi tarea,

y ademas tengo que validar que cada usuario creado solo pueda insertar datod dentro de  

una tabla (por ejemplo proyectos) pero que solo

pueda crear proyectos del departamento al que pertenece el usuario, como podria hacer eso? 

con trigger, procedimientos, funciones?

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

 Insisto en que no se puede crear un usuario dentro de otro usuario, puedes asignar a un usuario los mismos privilegios o los mismos roles que a otro, o que compartan el mismo tablespace, o que puedan hacer determinadas acciones sobre los mismos objetos, pero no hay usuarios dentro de otros.

Lo que sí hay, y a lo mejor te refieres a eso es que con la opción WITH GRANT OPTION puedes hacer que el usuario al que concedes privilegios sobre determinados objetos pueda a su vez concederlos a otros usuarios.

Por lo que comentas, seguramente lo que necesitas es conceder permisos de sistema en lugar de privilegios sobre objetos, y para ello, si quieres que el usuario 'autorizado' pueda a su vez conceder estos permisos has de utilizar la opción WITH ADMIN OPTION.

 

Sobre el control de los datos que un usuario inserta en una tabla, si se tratara de un control sencillo podrías utilizar un CHECK, pero por lo que comentas creo que lo más apropiado sería crear un TRIGGER del tipo BEFORE INSERT asociado a esta tabla que antes de cada INSERT haría la comprobación de que el usuario pertenezca al departamento.

katherine (no verificado)

buenas tardes yo voy hacer una base de datos en un solo computador q sentencia utilizo para q el resto de las computadoras tengan acceso a ella y poder ver todas las tablas como tambien agregar,eliminar y modificar registro?

gracisas

Reynaldo (no verificado)

Saludos.
Deseo dar privilegios a un usuario para que pueda acceder y modificar los datos y la estructura de los objetos de un esquema. Como puedo hacer esto sin necesidad de ejecutar un grant individual por cada objeto del esquema?

Gracias de antemano por la ayuda.

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Si quieres darle los privilegios sólo para un esquema creo que no te queda otro remedio que hacerlo objeto por objeto. La alternativa más parecida que se me ocurre es aplicar al usuario un grant de sistema, pero estos permisos los tendría para todos los esquemas:

SQL> GRANT SELECT ANY TABLE TO usuario;

 

De todas maneras, puedes utilizar el diccionario para crearte un script y 'automatizar' la concesión de permisos.

 

Puedes crear sinónimos para todos los objetos, para que el usuario no tenga que acceder con el formato 'esquema.tabla' a las tablas:

SELECT 'create public synonym ' || table_name || 
       ' for Esquema.' || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

Y sacar las sentencias de asignación de los permisos:

SELECT 'grant select, insert, update on Esquema.' 
       || table_name || ' to usuario;'
FROM dba_tables WHERE owner = 'Esquema';

 

Offline
Joined: 15/12/2011
Puntos: 1

saludos,

es para ver si me puedes decir como puedo crear un usuario que tenga el mismo roll de el sys es decir que con este usuario yo pueda hacer lo mismo que hago con el sys (acceso total). gracias

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Supongo que ya has creado el usuario, pero si no para crearlo, por ejemplo:

SQL> create user miusuario identified by mipassword;

Y para asignarle los privilegios de sys, que son privilegios de DBA, tan sencillo como:

SQL> grant DBA to miusuario;

Eso sí, necesitarás hacerlo con el usuario sys que comentas, u otro usuario que tenga permisos de DBA para conceder este tipo de privilegios.

 

Offline
Joined: 21/11/2012
Puntos: 1

 Buenas tardes, quisiera que me ayudarán en algo por favor.

 

Tengo un usuario que pidió copiar unas tablas de una BD de Producción a una de Desarrollo (prueba) , luego de esto indica que no puede acceder a una tabla, es la unica persona que no puede. Como puedo revisar si ese usuario tiene permiso? 

 

Gracias

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

 Échale un vistazo a este otro tema del foro sobre permisos. En los comentarios de respuesta tienes varias sentencias que puedes utilizar para consultar los permisos de los usuarios de la base de datos. 

Saludos,

Offline
Joined: 30/11/2012
Puntos: 1

Buenas tardes

Me pidieron crear una aplicacion en el APEX de oracle haciendola me di cuenta que requeria crear un directorio para cargar las imagenes de mis productos pero cuando intente correr:

CREATE OR REPLACE 

DIRECTORY IMAGES AS 'C:\ORACLE\BLOB\IMAGES';

Me dice  ORA-01031: insufficient privileges

Hay ya sabría que son privilegios, pero no sé dónde puedo entrar a la consola de el system a darle los privilegios al usuario ya que lo que he trabajado es en el apex y ya. Por otro lado lo intente con el un SQL comand line y me dice no conectado.

 

si se puede una explicacion de como cargar las imagenes a un campo de tipo de dato BLOB seria chévere

Gracias

 

 

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Si la instalación de Oracle la tienes en local, sólo tienes que entrar en SQLPlus desde linea de comandos. Para asignar privilegios al usuario que utilizas necesitarás utilizar un usuario administrador, con permisos de DBA, por lo que si sólo has utilizado APEX, lo más sencillo es que lo hagas de esta manera:

Entrar en SQLPlus como DBA sin introducir password

 

jado86 (no verificado)

 

Si me puede colaborar con lo siguiente

Desde un usuario con rol de administrador llamado “hr”  el cual es propietario de dos tablas llamadas “employess” y “departments” he creado un usuario llamado “usuario1” y he creado un rol llamado “palma” con privilegios para hacer select a las dos tablas mencionadas, para crear vistas, para crear tablas y para crear sesión, este rol se lo he dado a “usuario1”, además he creado un sinónimo público para cada una de las tablas, las siguientes son las sentencias

 

Créate user usuario1 identified by clave

create role palma

 

grant select on employees to palma

grant select on departments to palma

grant create view to palma

grant create table to palma

grant create session to palma

 

grant palma to usuario1

create or replace public synonym departments

for hr.departments

 

create or replace public synonym employess

for hr.employess

 

Mi problema es que al iniciar sesión con “usuario1” y tratar de crear una vista llamada “vista1” con la siguiente sentencia, me dice que no tengo privilegios suficientes para crear la vista.

 

create or replace view vista1 as

select * from employees

 

le agradezco si me puede ayudar con este inconveniente.

 

 

 

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Las sentencias son exactamente como las escribes? Porque al sinónimo le llamas 'employess', y la vista la creas sobre 'employees'

De todas maneras, para no liarte con el sinónimo puedes crear la vista haciendo referencia directa a la tabla, en lugar del sinónimo:

create or replace view vista1 as
select * from hr.employees

 

Offline
Joined: 26/09/2013
Puntos: 1

 hola carlos:

 

por que cuando me conecto por medio del bde del delphi a mi usuario en oracle aparte de aparecerme mis

tablas del usuario creado tamb me aparecen las del system oajala y me puedas responder la pregunta por favor

 

elfen (no verificado)

Hola!!

Tengo una duda acerca de el otorgar privilegios, necesito crear un usuario que pueda consultar todas las tablas menos 1 (cliente por ejemplo)

le hago el
grant select any table to usuario1

pro no se como quitarle el permiso a esa unica tabla??

gracias!!

Paolandrea (no verificado)

buenas tardes Señores,

Tengo un dilema , les escribo por si me pueden ayudar, tengo una tabla el cual hago un select en pl y muestra correctamente los registros, sin embargo si este select lo ato un reporte, me genera un error de tabla o vista no existe.

He chequeado los permisos, sinonimos y nada..

De antemano agradezco su colaboración.

Saludos!

Offline
Joined: 02/10/2013
Puntos: 1

 

 Buenas tardes Señores

Tengo un dilema , les escribo por si me pueden ayudar, tengo una tabla el cual hago un select en pl y muestra correctamente los registros, sin embargo si este select lo ato un reporte, me genera un error de tabla o vista no existe.

 

He chequeado los permisos, sinonimos y nada..

 

De antemano agradezco su colaboración.

 

 

centaurux (no verificado)

Hola Karol,

Si ya resolvio el problema perverso, pero si no, intente desde el reporte poner :
user.table ejecute el reporte, si se ejecuta correctamente es por que le falta el sinonimo o grant a la tabla para que el usuario con que lo esta ejecutando desde report tenga acceso

create synonym nombre_tabla from user.nombre_tabla;

grant select on tabla to userqueejecutaelreporte

Saludos
Pura vida.

Offline
Joined: 25/11/2013
Puntos: 1

hola carlos,
como podria hacer para utilizar en mi aplicacion de apex los usuarios de oracle con sus respectivos roles, privilegios, etc y no los de apex.
gracias de ante mano..

Claus (no verificado)

hola necesito ayuda para hacer una modificacion de character set
estoy utilizando Oracle 11 y mi schema ya esta en producción
trato de alterar la tabla:

ALTER TABLE ESCOLARIDAD CHARACTER SET utf8;
pero me manda el siguiente error :
Informe de error:
Error SQL: ORA-01735: opción ALTER TABLE no válida
01735. 00000 - "invalid ALTER TABLE option"
pense que eran los privilegios del usuario pero ya tiene todos los privilegios hacia una tabla
y gracias de antemano =)

ANGELA (no verificado)

Hola a todos, tengo el siguiente problema, al iniciar la implementacion de un aplicativo sobre oracle 11g ,se le dio permisos de dba a un usuario, ahora la auditoria solicita quitar estos permios de dba, los quite pero empezaron a salir mensajes en el aplicativo al ejecutar algo como "no existen privilegios en tablespace USERS",revisé y hay muchas tablas creadas en el tablespace "users" por este usuario, pero el usuario tiene un tablespace asignado llamado PALMA. Q instruccion debo ejecutar para darle privilegios sobre este tablespace especificamente a esas tablas Y Puedo cambiar estas tablas al tablespaces Palma?

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Sobre los permisos, los usuarios tienen un tablespace definido por defecto, pero los permisos se definen más bien sobre las tablas, no sobre los tablespaces. Puede que el problema sea que al quitarle los privilegios de DBA necesites asignar algún permiso genérico. Te enlazo un artículo en el que se comenta cómo crear un nuevo esquema de usuario desarrollador de Oracle para que puedas revisar si tu usuario tiene los permisos básicos para trabajar.

Sobre mover las tablas a otro Tablespace, enlazo otro post en el que se explica cómo unificar tablespaces en Oracle 10g, ojo con esta operación, que no es complicada, pero es delicada, si lo haces prepáralo bien y te recomiendo que hagas antes una prueba con una tabla que no utilice nadie.

 

Offline
Joined: 09/04/2014
Puntos: 3

 

 

Buenas tardes Carlos:

 

Lo que yo quisiera es dar privilegios a un usuario de select, update, insert y delete sobre todos los objetos de un esquema, mas no para todos los objetos de la BD.


Es decir no quierdo darle por ej:


grant select any table to eramirez;


Porque ahi le estoy diciendo que haga select sobre cualquiera tabla y yo solo quiero el select sobre todas las tablas de un esquema determinado. Es posible eso?


Muchas gracias por tu atención.

 

 

Offline
Joined: 09/04/2014
Puntos: 3

 Bueno de tanto buscar la solución es la siguiente...

 

 

   FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner='TheOwner') LOOP

      EXECUTE IMMEDIATE 'grant select on '||R.owner||'.'||R.table_name||' to TheUser';

   END LOOP;

END;

 

Si quieres aplicarlo a un PROCEDURE cambia "all_tables" por "all_procedures"

 

 

 

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Buena solución, eddy, gracias por compartirla!

Offline
Joined: 09/04/2014
Puntos: 3

 Si descuida!

pepas (no verificado)

Hola,
Desde hace un par de dias que estoy leiendoel foro, y hoy he pensado participar,
Un saludo.

Imagen de Comunidad-Dataprix
Joined: 08/06/2013
Puntos: 252

Pues bienvenida, 'pepas', pero recuerda que si quieres abrir nuevos temas, y acumular puntos por participar, tienes que registrarte.

 

Saludos,

Galo Galarza (no verificado)

Buenas tardes solicito su ayuda mi problema es el siguiente:
Desde el usuario system@xe; connect Normal, trato de compilar un pck que tiene en uno de sus cursores la vista v$process, pero obtengo como error: La tabla o vista no existe, pensé que era por permisos de administrador, pero me sigue saliendo el mismo error. Necesito compilar el pck pero con conexión Normal, porque en SYSDBA no me aparece este error, pero las tablas que se encuentran en el pck y otros prc, los tengo creados en modo de conexión normal, y al pasar a conexión SYSDBA las tablas creadas aparecen que no existen.

Imagen de carlos
Offline
Joined: 28/12/2005
Puntos: 1211

Prueba a poner delante de los objetos el nombre del propietario. Como SYSDBA has de tener acceso a todo, pero si la tabla la ha creado otro usuario y no hay ningún sinónimo público definido sobre la misma has de indicar delante de la misma el usario propietario.

Por ejemplo: SELECT * FROM usuario.tabla

Gestion del Conocimiento    |   Business Intelligence y Analítica   |    Bases de Datos   |     ERP    |     CRM     |   Cloud computing    |   Tendencias IT