Archivo de la etiqueta: GRANT

Que GRANT se puede asignar en función del objeto destino en ORACLE

Según el objeto de que se trate, en Oracle podemos dar los siguientes privilegios:

Tables: select, insert, update, delete, alter, debug, flashback, on commit refresh, query rewrite, references, all
Views: select, insert, update, delete, under, references, flashback, debug
Sequence: alter, select
Packages, Procedures, Functions (Java classes, sources…): execute, debug
Materialized Views: delete, flashback, insert, select, update
Directories: read, write
Libraries: execute
User defined types: execute, debug, under
Operators: execute
Indextypes: execute

 

Manipular una tabla de un entorno Oracle desde otro entorno Oracle mediante DBLINK

Probablemente como administradores de Oracle nos habrán solicitado lo siguiente:

Querer consultar o modificar una tabla que está en un Servidor Oracle con un usuario que está en otro servidor Oracle.

Para poder realizar esta tarea, basta con crear un dblink entre ambas bases de datos y crearlo de manera PUBLIC y posteriormente asignar los privilegios(GRANT) de la tabla que queremos poder ver a PUBLIC. Dicha asignación de permisos a PUBLIC la realizaremos en el servidor Oracle donde está la tabla que queremos ver. Para ver que tipo de GRANT podemos asignar puedes consultar esta entrada de blog.

Ejemplo:

En el servidor “origen” creamos el dblink public:

CREATE PUBLIC DATABASE LINK "DBLINK_DESTINO"
CONNECT TO SYSTEM --> o el usuario que queramos usar
IDENTIFIED BY "<pwd>"
USING 'CADENA_CONEXION_DESTINO'; --> que existirá en tnsnames.ora 
del servidor Origen y donde se especifica el servidor, puerto, etc...
donde conectaremos cuando hagamos las consultas

Luego en el servidor “destino”:

Ejecutaremos desde sqlplus por ejemplo y con el propietario de la tabla en cuestión:

GRANT ALL ON <nombre_propietario>.<nombre_tabla> TO PUBLIC;

Para mejorar lo anterior y evitar tener que escribir el nombre del propietario en las consultas, podemos crear un sinónimo de esta manera:

CREATE PUBLIC SYNONYM <nombre_tabla> FOR <nombre_propietario>.<nombre_tabla>;

Lo importante de las sentencias anteriores es especificar “PUBLIC” de esta manera los privilegios se hacen disponibles a todos los usuarios de la base de datos. Y mediante el dblink, también lo haces disponibles a aquellos usuarios que puedan conectarse mediante ese dblink, que en este ejemplo son todos.

ORA-01031: privilegios insuficientes … al hacer un GRANT

Al hacer un GRANT conectado tanto como el usuario SYSTEM y/o SYS en una versión Oracle 7.3.4 para dar permisos de un package de un usuario a otro me aparece el error Oracle:

ORA-01031: privilegios insuficientes

La solución más rápida a este error es conectarse como el usuario propietario del Package (u del objeto que nos dé problemas) y ejecutar el comando GRANT.

Ej.

$ sqlplus system/password_system
SQL> connect usuario/password_usuario
SQL> show user
el usuario es “usuario”
SQL>  GRANT DELETE, INSERT, SELECT, UPDATE ON OPS$USUARIO.PACKAGE_EJEMPLO TO OPS$USUARIO_DESTINO;

Pero en mi caso, no tenía el password del usuario en concreto y tampoco me dejaban cambiarlo por si afectaba a alguna aplicación. ¿ Que se puede hacer en este caso ?

Como sí que tenía el password de root a nivel de sistema operativo (Unix en este caso) hice lo siguiente:

# su – usuario
$ whoami
usuario
$ sqlplus /

Ahora ya estaba conectado como el usuario “usuario” y ya podía ejecutar el comando GRANT.

SQL> show user
el usuario es “usuario”
SQL>  GRANT DELETE, INSERT, SELECT, UPDATE ON OPS$USUARIO.PACKAGE_EJEMPLO TO OPS$USUARIO_DESTINO;

Fácil  ¿verdad?